概念
二叉查找樹是一種數據結構,採用了圖的樹形結構,數據存儲於二叉查找樹的各個結點中。算法
二叉查找樹又叫二叉搜索樹或二叉排序樹。數據結構
如圖所示,即爲一個二叉查找樹的示例。 3d
二叉查找樹的特色
- 同堆同樣,每一個節點最多有兩個子結點
- 每一個結點的值均大於其左子樹上任意一個結點的值
- 每一個結點的值均小於其右子樹上任意一個結點的值
- 查詢二叉樹中最小值要從頂端開始找他的左子樹
- 查詢二叉樹中最大值要從頂端開始找他的右子樹
添加數據
- 首先從二叉查找樹的頂端結點開始尋找數字的位置
- 將想要添加的結點的值與該結點的值進行比較
- 若要添加的結點值小於當前結點值則往左移不然右移
- 左移或右移後與其子結點繼續比較,重複步驟3進行判斷左移仍是右移
- 當判斷至當前結點的子結點不存在則數據插入完畢
示例1,將數字1插入一個二查找樹中。cdn
- 將插入的數據與樹的頂端結點進行比較,1<15數據左移
- 左移後,與15的子結點9進行比較,1<9數據左移
- 左移後,與9的子結點3進行比較,1<3數據左移,因爲3沒有子結點了,因此將1做爲新結點添加到左下方
- 至此,1的添加操做就完成了
示例2,將數字4插入一個二叉查找樹中。blog
- 與示例1步驟同樣,與二叉樹頂端的結點進行比較,因爲4<15,數據左移
- 將插入的結點與15的子結點9進行比價,4<9,數據左移
- 將插入的結點與9的子結點3進行比較,4>3,數據右移
- 將插入的結點與3的子結點8進行比較,4>8,數據左移,8沒有子結點,因此將4做爲新結點添加到左下方
- 至此,4的添加操做完成
刪除數據
- 刪除結點時,判斷要刪除的結點是否有子結點,若子結點不存在則直接刪除
- 若要刪除的結點只有一個子結點,則先刪除目標結點,而後將子結點移到被刪除結點的位置上便可
- 若刪除的結點有多個子結點,則先刪除目標結點,而後在被刪除結點的左子樹中尋找最大結點,最後將最大結點移到被刪除結點的位置上,若要移動的結點還有子結點,則遞歸前面的操做。
- 存在多個子結點時,也可在被刪除結點的右子樹中尋找最小結點,將其移至被刪除結點的位置。
示例1,刪除數字28的結點排序
- 先判斷28所在結點是否有子結點
- 28結點無子結點直接刪除
示例2,刪除結點8遞歸
- 結點8有一個子結點,則先刪除目標結點8
- 移動目標結點的子結點4移到被刪除結點的位置上
示例3,刪除結點9圖片
- 刪除目標結點
- 在被刪除結點的左子樹中尋找最大結點
- 找到最大結點爲4,將其移至被刪除結點的位置
查詢數據
- 首先,從二叉樹的頂端結點開始往下查找。
- 與添加數據時同樣,將要查找的結點和樹中的結點進行比較,小於該結點則往左移,不然往右移
示例,查找樹中的結點12it
- 從二叉查找樹的頂端結點開始往下查找,將要查詢的結點12與頂端的結點15進行比較,12<15,數據左移
- 左移後,將要查詢的結點12與結點15的子結點4進行比較,5<12,數據右移
- 右移後,找到結點12,查詢結束
寫在最後
- 文中使用的圖片源自《個人第一本算法書》,如若侵權,請評論區留言,做者當即刪除相關圖片。
- 文中若有錯誤,歡迎在評論區指正,若是這篇文章幫到了你,歡迎點贊和關注😊
- 本文首發於掘金,未經許可禁止轉載💌