
先上二叉樹查找樹的刪除的代碼,因為刪除是二叉查找樹最復雜的操作:
二叉查找樹的概念及操作。主要內容包括二叉查找樹的性質,如何在二叉查找樹 中查找最大值、最小值和給定的值,如何找出某一個元素的前驅和后繼,如何在二叉查找樹中進行插入和刪除操作。在二叉查找樹上執行這些基本操作的時間與樹的 高度成正比,一棵隨機構造的二叉查找樹的期望高度為O(lgn),從而基本動態集合的操作平均時間為θ(lgn)。
1、二叉查找樹
二叉查找樹是按照二叉樹結構來組織的,因此可以用二叉鏈表結構表示。二叉查找樹中的關鍵字的存儲方式滿足的特征是:設x為二叉查找樹中的一個結點。如果y是x的左子樹中的一個結點,則key[y]≤key[x]。如果y是x的右子樹中的一個結點,則key[x]≤key[y]。根據二叉查找樹的特征可知,采用中根遍歷一棵二叉查找樹,可以得到樹中關鍵字有小到大的序列。
一棵二叉樹查找及其中根遍歷結果如下圖所示:
書中給出了一個定理:如果x是一棵包含n個結點的子樹的根,則其中根遍歷運行時間為θ(n)。
問題:二叉查找樹性質與最小堆之間有什么區別?能否利用最小堆的性質在O(n)時間內,按序輸出含有n個結點的樹中的所有關鍵字?
2、查詢二叉查找樹
二叉查找樹中最常見的操作是查找樹中的某個關鍵字,除了基本的查詢,還支持最大值、最小值、前驅和后繼查詢操作,書中就每種查詢進行了詳細的講解。
(1)查找SEARCH
在二叉查找樹中查找一個給定的關鍵字k的過程與二分查找很類似,根據二叉查找樹在的關鍵字存放的特征,很容易得出查找過程:首先是關鍵字k與樹根的關 鍵字進行比較,如果k大比根的關鍵字大,則在根的右子樹中查找,否則在根的左子樹中查找,重復此過程,直到找到與遇到空結點為止。例如下圖所示的查找關鍵 字13的過程:(查找過程每次在左右子樹中做出選擇,減少一半的工作量)
書中給出了查找過程的遞歸和非遞歸形式的偽代碼:
(2)查找最大關鍵字和最小關鍵字
根據二叉查找樹的特征,很容易查找出最大和最小關鍵字。查找二叉樹中的最小關鍵字:從根結點開始,沿著各個節點的left指針查找下去,直到遇到 NULL時結束。如果一個結點x無左子樹,則以x為根的子樹中,最小關鍵字就是key[x]。查找二叉樹中的最大關鍵字:從根結點開始,沿著各個結點的 right指針查找下去,直到遇到NULL時結束。書中給出了查找最大最小關鍵字的偽代碼:
(3)前驅和后繼
給定一個二叉查找樹中的結點,找出在中序遍歷順序下某個節點的前驅和后繼。如果樹中所有關鍵字都不相同,則某一結點x的前驅就是小于key[x]的所 有關鍵字中最大的那個結點,后繼即是大于key[x]中的所有關鍵字中最小的那個結點。根據二叉查找樹的結構和性質,不用對關鍵字做任何比較,就可以找到 某個結點的前驅和后繼。
查找前驅步驟:先判斷x是否有左子樹,如果有則在left[x]中查找關鍵字最大的結點,即是x的前驅。如果沒有左子樹,則從x繼續向上執行此操作,直到遇到某個結點是其父節點的右孩子結點。例如下圖查找結點7的前驅結點6過程:
查找后繼步驟:先判斷x是否有右子樹,如果有則在right[x]中查找關鍵字最小的結點,即使x的后繼。如果沒有右子樹,則從x的父節點開始向上查找,直到遇到某個結點是其父結點的左兒子的結點時為止。例如下圖查找結點13的后繼結點15的過程:
書中給出了求x結點后繼結點的偽代碼:
定理:對一棵高度為h的二叉查找,動態集合操作SEARCH、MINMUM、MAXMUM、SUCCESSOR、PROCESSOR等的運行時間均為O(h)。
3、插入和刪除
插入和刪除會引起二叉查找表示的動態集合的變化,難點在在插入和刪除的過程中要保持二叉查找樹的性質。插入過程相當來說要簡單一些,刪除結點比較復雜。
(1)插入
插入結點的位置對應著查找過程中查找不成功時候的結點位置,因此需要從根結點開始查找帶插入結點位置,找到位置后插入即可。下圖所示插入結點過程:
書中給出了插入過程的偽代碼:
插入過程運行時間為O(h),h為樹的高度。
(2)刪除
從二叉查找樹中刪除給定的結點z,分三種情況討論:
<1>結點z沒有左右子樹,則修改其父節點p[z],使其為NULL。刪除過程如下圖所示:
<2>如果結點z只有一個子樹(左子樹或者右子樹),通過在其子結點與父節點建立一條鏈來刪除z。刪除過程如下圖所示:
<3>如果z有兩個子女,則先刪除z的后繼y(y沒有左孩子),在用y的內容來替代z的內容。
書中給出了刪除過程的偽代碼:
定理:對高度為h的二叉查找樹,動態集合操作INSERT和DELETE的運行時間為O(h)。
4、實現測試
采用C++語言實現一個簡單的二叉查找樹,支持動態集合的基本操作:search、minmum、maxmum、predecessor、successor、insert和delete。設計的二叉查找樹結構如下所示:
完整程序如下所示:
數據分析咨詢請掃描二維碼
若不方便掃碼,搜微信號:CDAshujufenxi
CDA數據分析師證書考試體系(更新于2025年05月22日)
2025-05-26解碼數據基因:從數字敏感度到邏輯思維 每當看到超市貨架上商品的排列變化,你是否會聯想到背后的銷售數據波動?三年前在零售行 ...
2025-05-23在本文中,我們將探討 AI 為何能夠加速數據分析、如何在每個步驟中實現數據分析自動化以及使用哪些工具。 數據分析中的AI是什么 ...
2025-05-20當數據遇見人生:我的第一個分析項目 記得三年前接手第一個數據分析項目時,我面對Excel里密密麻麻的銷售數據手足無措。那些跳動 ...
2025-05-20在數字化運營的時代,企業每天都在產生海量數據:用戶點擊行為、商品銷售記錄、廣告投放反饋…… 這些數據就像散落的拼圖,而相 ...
2025-05-19在當今數字化營銷時代,小紅書作為國內領先的社交電商平臺,其銷售數據蘊含著巨大的商業價值。通過對小紅書銷售數據的深入分析, ...
2025-05-16Excel作為最常用的數據分析工具,有沒有什么工具可以幫助我們快速地使用excel表格,只要輕松幾步甚至輸入幾項指令就能搞定呢? ...
2025-05-15數據,如同無形的燃料,驅動著現代社會的運轉。從全球互聯網用戶每天產生的2.5億TB數據,到制造業的傳感器、金融交易 ...
2025-05-15大數據是什么_數據分析師培訓 其實,現在的大數據指的并不僅僅是海量數據,更準確而言是對大數據分析的方法。傳統的數 ...
2025-05-14CDA持證人簡介: 萬木,CDA L1持證人,某電商中廠BI工程師 ,5年數據經驗1年BI內訓師,高級數據分析師,擁有豐富的行業經驗。 ...
2025-05-13CDA持證人簡介: 王明月 ,CDA 數據分析師二級持證人,2年數據產品工作經驗,管理學博士在讀。 學習入口:https://edu.cda.cn/g ...
2025-05-12CDA持證人簡介: 楊貞璽 ,CDA一級持證人,鄭州大學情報學碩士研究生,某上市公司數據分析師。 學習入口:https://edu.cda.cn/g ...
2025-05-09CDA持證人簡介 程靖 CDA會員大咖,暢銷書《小白學產品》作者,13年頂級互聯網公司產品經理相關經驗,曾在百度、美團、阿里等 ...
2025-05-07相信很多做數據分析的小伙伴,都接到過一些高階的數據分析需求,實現的過程需要用到一些數據獲取,數據清洗轉換,建模方法等,這 ...
2025-05-06以下的文章內容來源于劉靜老師的專欄,如果您想閱讀專欄《10大業務分析模型突破業務瓶頸》,點擊下方鏈接 https://edu.cda.cn/g ...
2025-04-30CDA持證人簡介: 邱立峰 CDA 數據分析師二級持證人,數字化轉型專家,數據治理專家,高級數據分析師,擁有豐富的行業經驗。 ...
2025-04-29CDA持證人簡介: 程靖 CDA會員大咖,暢銷書《小白學產品》作者,13年頂級互聯網公司產品經理相關經驗,曾在百度,美團,阿里等 ...
2025-04-28CDA持證人簡介: 居瑜 ,CDA一級持證人國企財務經理,13年財務管理運營經驗,在數據分析就業和實踐經驗方面有著豐富的積累和經 ...
2025-04-27數據分析在當今信息時代發揮著重要作用。單因素方差分析(One-Way ANOVA)是一種關鍵的統計方法,用于比較三個或更多獨立樣本組 ...
2025-04-25CDA持證人簡介: 居瑜 ,CDA一級持證人國企財務經理,13年財務管理運營經驗,在數據分析就業和實踐經驗方面有著豐富的積累和經 ...
2025-04-25