26考研——查找_樹形查找_二叉排序樹(BST)(7)

408答疑


文章目錄

  • 三、樹形查找
    • 二叉排序樹(BST)
      • 二叉排序樹中結點值之間的關系
      • 二叉樹形查找
      • 二叉排序樹的查找過程
        • 示例
      • 向二叉排序樹中插入結點
        • 插入過程
        • 示例
      • 構造二叉排序樹的過程
        • 構造示例
      • 二叉排序樹中刪除結點的操作
        • 情況一:被刪除結點是葉結點
        • 情況二:被刪除結點只有一棵左子樹或右子樹
        • 情況三:被刪除結點有左、右兩棵子樹
        • 二叉排序樹中刪除并插入某結點的分析
      • 代碼實操
        • 結構定義
        • 插入操作
        • 查找操作
        • 刪除操作
        • 中序遍歷
  • 六、參考資料
    • 鮑魚科技課件
    • 26王道考研書


三、樹形查找

二叉排序樹(BST)

  • 構造二叉排序樹的目的并不是排序,而是提高查找、插入和刪除關鍵字的速度,二叉排序樹這種非線性結構也有利于插入和刪除的實現。
  • 二叉排序樹(也稱二叉查找樹)或者是一棵空樹,或者是具有下列特性的二叉樹:
    1. 若左子樹非空,則左子樹上所有結點的值均小于根結點的值。
    2. 若右子樹非空,則右子樹上所有結點的值均大于根結點的值。
    3. 左、右子樹也分別是一棵二叉排序樹。

二叉排序樹中結點值之間的關系

根據二叉排序樹的定義,左子樹結點值 < 根結點值 < 右子樹結點值,因此對二叉排序樹進行中序遍歷,可以得到一個遞增的有序序列。如下圖所示二叉排序樹的中序遍歷序列為 123468。

在這里插入圖片描述

二叉樹形查找

  • 二叉樹形查找是以二叉排序樹(BST)為基礎進行查找,并演化出相應的平衡樹AVL和紅黑樹RB。
  • 除了掌握基礎的查找,還需掌握平衡樹的平衡調整過程。

二叉排序樹的查找過程

二叉排序樹的查找是從根結點開始,沿某個分支逐層向下比較的過程。若二叉排序樹非空,先將給定值與根結點的關鍵字比較,若相等,則查找成功;若不等,若小于根結點的關鍵字,則在根結點的左子樹上查找,否則在根結點的右子樹上查找。這顯然是一個遞歸的過程。

示例

如下圖中查找值為 4 的結點。首先 4 與根結點 6 比較。由于 4 小于 6,所以在根結點 6 的左子樹中繼續查找。由于 4 大于 2,所以在結點 2 的右子樹中查找,查找成功。

在這里插入圖片描述

向二叉排序樹中插入結點

二叉排序樹作為一種動態樹表,其特點是樹的結構通常不是一次生成的,而是在查找過程中,當樹中不存在關鍵字值等于給定值的結點時再進行插入的。

插入過程
  • 若原二叉排序樹為空,則直接插入;
  • 否則,若關鍵字 k k k 小于根結點值,則插入到左子樹,若關鍵字 k k k 大于根結點值,則插入到右子樹。
  • 插入的結點一定是一個新添加的葉結點,且是查找失敗時的查找路徑上訪問的最后一個結點的左孩子或右孩子。
示例

下圖展示了在一棵二叉排序樹中依次插入結點 28 和結點 58 的過程,虛線表示的邊是其查找的路徑。

在這里插入圖片描述

構造二叉排序樹的過程

從一棵空樹出發,依次輸入元素,將它們插入二叉排序樹中的合適位置。設查找的關鍵字序列為 {45, 24, 53, 45, 12, 24},則生成的二叉排序樹如下圖所示。

構造示例

在這里插入圖片描述

每一步都是根據關鍵字與當前樹中結點的比較結果,決定插入的位置。

二叉排序樹中刪除結點的操作

在二叉排序樹中刪除一個結點時,不能簡單地刪除該結點及其所有子結點,而是需要重新鏈接因刪除結點而斷開的二叉鏈表,確保二叉排序樹的性質不丟失。刪除操作的實現過程按以下三種情況來處理:

情況一:被刪除結點是葉結點
  • 若被刪除結點 z z z 是葉結點,則直接刪除,不會破壞二叉排序樹的性質。

在這里插入圖片描述

情況二:被刪除結點只有一棵左子樹或右子樹
  • 若結點 z z z 只有一棵左子樹或右子樹,則讓 z z z 的子樹成為 z z z 父結點的子樹,替代 z z z 的位置。

在這里插入圖片描述

情況三:被刪除結點有左、右兩棵子樹
  • 若結點 z z z 有左、右兩棵子樹,則令 z z z 的直接后繼(或直接前驅)替代 z z z,然后從二叉排序樹中刪去這個直接后繼(或直接前驅),這樣就轉變成了第一或第二種情況。

在這里插入圖片描述

二叉排序樹中刪除并插入某結點的分析

若在二叉排序樹中刪除并插入某結點,得到的二叉排序樹是否和原來的相同?

不一定。這個問題需要考慮刪除和插入操作對樹結構的影響,以及這些操作是否能夠恢復到原始的樹結構。具體分析可能涉及到樹的平衡性、結點的相對位置以及操作的順序等因素。

代碼實操

結構定義
  • 定義二叉排序樹的結點結構體 BSTNode,包含數據域 data,指向左子樹的指針 left 和指向右子樹的指針 right
typedef struct BSTNode {ElemType data;struct BSTNode *left;struct BSTNode *right;
} BSTNode, *BSTRoot;
插入操作
  • 在二叉排序樹中插入值 x,遞歸地找到正確的位置插入新結點。
bool insertBST(BSTNode *&t, int x) {if (t == NULL) {t = (BSTNode*)malloc(sizeof(BSTNode));t->data = x;t->left = t->right = NULL;return true; // 插入成功}if (x == t->data)return false; // 插入失敗if (x < t->data)insertBST(t->left, x);elseinsertBST(t->right, x);return true;    
}
查找操作
  • 在二叉排序樹中查找關鍵字 key,遞歸地遍歷樹直到找到或到達葉子結點。
BSTNode* searchBST(BSTNode *t, int key) {if (t == NULL || t->data == key)return t;if (key < t->data)return searchBST(t->left, key);else return searchBST(t->right, key);
}
刪除操作
  • 刪除二叉排序樹中關鍵字為 key 的結點,處理三種情況:無子結點、一個子結點、兩個子結點。
bool removeBST(BSTNode *&t, int key) {if (t == NULL)return false; // 刪除失敗if (key < t->data)removeBST(t->left, key);else if (key > t->data)removeBST(t->right, key);else {BSTNode *p = NULL;if (t->left != NULL && t->right != NULL) {p = t->left;while (p->right != NULL)p = p->right;t->data = p->data;removeBST(t->left, p->data);} else {BSTNode *child = (t->left != NULL) ? t->left : t->right;p = t;t = child;free(p);}}return true;
}
中序遍歷
  • 對二叉排序樹進行中序遍歷,輸出有序序列。
void sortBST(BSTNode *t) {if (t != NULL) {sortBST(t->left);printf("%d ", t->data);sortBST(t->right);}
}

六、參考資料

鮑魚科技課件

b站免費王道課后題講解:
在這里插入圖片描述

網課全程班:
在這里插入圖片描述

26王道考研書

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/899207.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/899207.shtml
英文地址,請注明出處:http://en.pswp.cn/news/899207.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【數據庫事務、消息隊列事務、Redis 事務、Spring 事務 詳細分析】

數據庫事務、消息隊列事務、Redis 事務、Spring 事務** 的詳細分析 在分布式系統和應用開發中&#xff0c;事務管理是確保數據一致性和可靠性的關鍵機制。以下是針對 數據庫事務、消息隊列事務、Redis 事務、Spring 事務 的詳細分析&#xff0c;包括原理、特點、適用場景和對比…

kubectl 命令參數詳解與示例

kubectl 命令參數詳解與示例 kubectl 是 Kubernetes 的命令行工具&#xff0c;用于與 Kubernetes 集群交互。下面我將詳細介紹 kubectl 的主要命令參數&#xff0c;并提供相應的使用示例。 一、基礎命令 1. kubectl get - 獲取資源信息 常用參數&#xff1a; -n, --namesp…

#vue中解決異步請求的競態

// composables/useFetchWithoutRace.js import { ref } from vue; import axios from axios;// 定義一個可復用的 Composition 函數&#xff0c;處理帶有競態控制的異步請求 export function useFetchWithoutRace() {// 定義響應式變量 latestRequestId&#xff0c;用于追蹤最…

如何在 Postman 中導入和導出 cURL 命令?

cURL 是一款廣受歡迎的命令行工具&#xff0c;專門用于執行 HTTP 請求。它在 Web 應用或 API 測試中極為實用&#xff0c;讓用戶得以借助在 API 開發者社區廣為流行的成熟語法&#xff0c;直接通過命令行與 API 進行交互。若你需要在多個環境下運行眾多 cURL 命令&#xff0c;可…

用python制作一個貪吃蛇小游戲

文章目錄 效果圖python源碼使用說明效果圖 只需要一百多行python代碼,就能制作一個貪吃蛇小游戲。效果如下: 操作說明: 你可以使用上下左右箭頭鍵來控制蛇的移動方向。蛇吃到食物后會變長,當蛇撞到墻壁或自己的身體時游戲結束。游戲結束后,你可以按 Q 退出游戲,或按 C…

react 15-16-17-18各版本的核心區別、底層原理及演進邏輯的深度解析

一、React 15&#xff08;2016&#xff09; 核心架構&#xff1a;Stack Reconciler&#xff08;棧協調器&#xff09; 工作原理&#xff1a; 同步遞歸渲染&#xff1a;采用深度優先遍歷方式遞歸處理 Virtual DOM&#xff0c;形成不可中斷的調用棧渲染流程&#xff1a;1. 觸發 …

微信小程序pdf預覽

1.示例圖 2.代碼 fileId&#xff1a;要預覽的pdf文件的id viewsFiles(fileId) {wx.showLoading({title: 加載中...});var params {url: "/common/getFile/" fileId ,//后端提供的接口method: "GET",responseType: "arraybuffer",callBack: …

雪花算法生成分布式唯一ID

雪花算法的結構是由時間戳、工作機器ID和序列號構成。要確保全局唯一&#xff0c;必須保證每個節點的機器ID唯一&#xff0c;并且同一毫秒內序列號不重復。在分庫分表的環境下使用雪花算法&#xff0c;機器ID的分配是關鍵。常見的做法是通過分布式系統協調&#xff0c;比如使用…

把手搭建vue前后端管理系統-TAB標簽通過pinia來進行管理(二十六)

目標&#xff1a;通過pinia的store來進行組件狀態的統一管理&#xff0c;這樣大家都可以共用到這個組件的狀態信息&#xff0c;就可以實現組件的聯動 一、添加側邊欄菜單的點擊事件&#xff1a; 1、CommonAside.vue里面添加click的事件 <el-menu-itemv-for"item in …

this(執行上下文)

&#x1f6a9; 這個專欄是一個 JS 進階系列&#xff0c;當前內容為 JS 執行機制&#xff0c;建議按順序閱讀 執行上下文&作用域 詞法環境&變量環境 this&#xff08;上下文對象&#xff09; &#x1f539; 概述 &#x1f30d; 前提概要&#xff1a; 在上文 執行上下文&…

計算機網絡——數據鏈路層的功能

目錄 物理鏈路 邏輯鏈路 封裝成幀&#xff08;組幀&#xff09; 幀定界 透明傳輸 SDU 差錯控制 可靠傳輸 流量控制 介質訪問控制 主機需要實現第一層到第五層的功能&#xff0c;而路由器這種節點只需要實現第一層到第三層的這些功能 假設左邊用戶需要給右邊用戶發送…

計算機網絡 --應用層

計算機網絡 --應用層 一、應用層概述 1. 功能 應用層為應用程序通信提供直接服務&#xff0c;這種服務是用戶能夠直接感知到的數據通信服務。核心功能包括&#xff1a; 文件傳輸&#xff1a;實現不同設備間文件的傳輸操作。訪問管理&#xff1a;對用戶訪問資源等進行管理。電…

企業級Linux服務器初始化優化全流程

實戰指南&#xff1a;企業級Linux服務器初始化優化全流程 本文基于某電商平臺百萬級并發服務器的真實調優案例整理&#xff0c;所有操作均在Rocky Linux8.5驗證通過&#xff0c;不同發行版請注意命令差異 一、服務器安全加固&#xff08;Situation-Task-Action-Result&#xff…

OpenAI流式解析

OpenAI 流式的代碼&#xff1a; 首選一般請使用os.getenv 去讀環境變量的內容 注意使用pip install python-dotenv 的安裝方法 load_dotenv 是這個庫提供的一個函數&#xff0c;用于讀取 .env 文件并將其中定義的鍵值對設置為系統的環境變量。 默認情況下&#xff0c;load_…

數據抓取的緩存策略:減少重復請求與資源消耗

在數據采集領域&#xff0c;爬蟲效率是決定項目成敗的關鍵因素之一。傳統的爬蟲架構往往因請求頻繁、資源消耗較大以及重復抓取等問題&#xff0c;導致效率低下。這些問題不僅拖慢了數據獲取的速度&#xff0c;還可能引發目標服務器的過載風險&#xff0c;甚至導致爬蟲被限制。…

k8s部署argocd

前言 ArgoCD是一個基于Kubernetes的GitOps持續交付工具&#xff0c;應用的部署和更新都可以在Git倉庫上同步實現&#xff0c;并自帶一個可視化界面。本文介紹如何使用GitHelmArgocd方式來實現在k8s中部署和更新應用服務&#xff1b; 安裝Argocd 準備一個k8s集群&#xff0c;然…

【Linux】MAC幀

目錄 一、MAC幀 &#xff08;一&#xff09;IP地址和MAC地址 &#xff08;二&#xff09;MAC幀格式 &#xff08;三&#xff09;MTU對IP協議的影響、 &#xff08;四&#xff09;MTU對UDP協議的影響 &#xff08;五&#xff09;MTU對TCP協議的影響 二、以太網協議 &…

MySQL - 數據庫基礎操作

SQL語句 結構化查詢語言(Structured Query Language)&#xff0c;在關系型數據庫上執行數據操作、數據檢索以及數據維護的標準語言。 分類 DDL 數據定義語言(Data Definition Language)&#xff0c;定義對數據庫對象(庫、表、列、索引)的操作。 DML 數據操作語言(Data Manip…

GraalVM原生鏡像支持:Spring Cloud應用啟動速度提升90%

引言&#xff1a;當Spring Cloud遇見GraalVM&#xff0c;啟動時間進入秒級時代 傳統Spring Cloud應用因動態類加載、反射等機制導致啟動緩慢&#xff08;通常超過30秒&#xff09;&#xff0c;在Serverless和Kubernetes滾動更新場景下成為性能瓶頸。Spring Cloud 2023.x通過**G…

【Unity3D】攝像機適配場景以及Canvas適配

目錄 寬度不變策略 高度不變策略 寬度不變策略 開發分辨率 750*1334 (寬高比:0.56) 真機分辨率 1170*2532 (寬高比:0.46) 真機寬高比<開發寬高比&#xff0c;采用寬度不變策略 理由&#xff1a;小于代表真機高度比開發高度更大&#xff0c;因此不需要擔心高度上…