樹(中)
二叉搜索(排序/查找)樹
作用:為了進行二分查找,將數(shù)據(jù)構(gòu)建在查找樹中,相比與線性結(jié)構(gòu)樹的插入刪除等動態(tài)操作更為方便。
定義
- 可以為空
- 若不為空,左子樹的鍵值都小于根節(jié)點,右子樹的鍵值都大于根節(jié)點。
- 左右子樹都是二叉搜索樹。
操作
- 增加
- 刪除
刪除過程略復雜,如果是葉子節(jié)點可以直接刪除,如果有一個孩子,則直接讓孩子替代原來的位置;如果有兩個孩子,則選擇左子樹的最大值,或者右子樹的最小值,來替代原來的位置
這是就轉(zhuǎn)化成了一個孩子(沒有孩子 )的情況。
平衡二叉樹
作用:對于同一個序列,如果根節(jié)點確定下來那么,整個搜索樹也就去確定了,所以對于選定不同的根節(jié)點,構(gòu)造出來的樹的形狀是不一樣的,其查找效率也不同。
一種高效率的查找樹是,左子樹和右子樹深度相近。
衡量指標:平衡因子。左右子樹的高度差。要求:小于1;
平衡二叉樹的高度能達到log2(n)?
h層高度的平衡二叉樹,最少需要hn個節(jié)點。可以推出:hn = h(n-1) + h(n-2) + 1;可以看出,類似于斐期那比數(shù)列。得出:hn = f(h+2) -1;
可以推出:節(jié)點數(shù)為n的平衡二叉樹,高度最大能達到log2(n)
平衡二叉樹的調(diào)整
為什么需要調(diào)整?
當動態(tài)的刪除/增加一個序列,適合最根節(jié)點的鍵值,必然會改變,所以會造成二叉樹由平衡變?yōu)椴黄胶狻?/p>
幾個概念:
被破壞者:由于插入/刪除一個節(jié)點,造成某個節(jié)點不在平衡(可能有多個節(jié)點被破壞,只考慮最底層的節(jié)點)。
破壞者:插入/刪除的節(jié)點。
- R旋:破壞者在被破者的右子樹的右子樹上。
- L旋:破壞者在被破壞者的左子樹的左子樹上。
- LR旋:破壞者在被破壞者的左子樹的右子樹上。
- RL旋:破壞者在被破壞者的右子樹的左子樹上。