1. 程式人生 > >資料結構——4.1 二叉搜尋樹

資料結構——4.1 二叉搜尋樹

一、二叉搜尋樹

一棵二叉樹,可以為空;如果不為空,滿足以下性質:
1)非空左子樹的所有鍵值小於其根結點的鍵值
2)非空右子樹的所有鍵值大於其根結點的鍵值
3)左右子樹都是二叉搜尋樹
在這裡插入圖片描述

二、二叉搜尋樹操作的特別函式

1、查詢

在這裡插入圖片描述

1)Find

① 查詢從根結點開始,如果樹為空,返回NULL
② 若搜尋樹非空,則根結點關鍵字和X進行比較,並進行不同處理

  • X小於根結點鍵值,只需要在左子樹中繼續搜尋
  • X大於根結點鍵值,只需要在右子樹中繼續搜尋
  • 若兩者比較結果是相等,搜尋完成,返回指向此結點的指標。
    在這裡插入圖片描述
    在這裡插入圖片描述
    上面的方式是一種尾遞迴,都知道遞迴的效率不是很高,尾遞迴是在程式分支的最後(在返回的時候)出現遞迴,從編譯的角度將,尾遞迴都可以用迴圈來實現,改為迭代
    函式:
    在這裡插入圖片描述
    查詢的效率和樹的高度有關。如果沒有左子樹或沒有右子樹,就形成了一條鏈,就達不到O(logn)的效果了,所以總的來說我們希望這個樹看起來比較平衡,就不往一邊倒

2)查詢最大元素和最小元素

最大元素一定是在樹的最右分支的端結點上
最小元素一定是在樹的最左分支的端結點上

在這裡插入圖片描述
所以搜尋樹的最大元素結點,一定沒有右兒子
在這裡插入圖片描述

2、插入和刪除

在這裡插入圖片描述

1)二叉搜尋樹的插入

關鍵是要找到元素應該插入的位置,可以採用與find類似的方法。
在這裡插入圖片描述

在這裡插入圖片描述

例子

在這裡插入圖片描述

2)二叉搜尋樹的刪除

考慮三種情況:
① 要刪除的是葉節點:直接刪除,並再修改其父結點指標–置為NULL
② 要刪除的結點是隻有一個孩子的結點:將其父結點的指標指向要刪除結點的孩子結點
在這裡插入圖片描述


③ 要刪除的結點有左、右兩棵子樹:用另一結點代替被刪除的結點:右子樹的最小元素或者左子樹的最大元素
在這裡插入圖片描述
在這裡插入圖片描述