《DSAA》 12 1 自頂向下伸展樹

2021-07-25 20:34:00 字數 762 閱讀 4706

在許多應用中,當乙個節點被訪問後,馬上就很可能再次被訪問到,研究表明這種情況比人們預料的要頻繁的多。所以伸展樹的基本想法是:當乙個節點被訪問後,它就要通過一系列的旋轉被放到根上。

自頂向下伸展樹的搜尋方式非常獨特,它實際上是乙個拆了又裝的過程,這個過程被稱為伸展:

最開始先新建兩顆空樹:l樹和r樹,用於快取。在從原樹自頂向下搜尋時,每一次迭代都將父節點以上的部分拆除,視情況接到兩旁的l樹或r樹上,直到搜尋結束,這時用l樹和r樹接到到根上,而把根上原來的左右子樹分別接到l樹和r樹上,處理完畢。

此時的樹根就是所要尋找的節點,或者是乙個最接近的節點。

值得一提的是:由於伸展樹的特性,它的刪除操作比其他的二叉搜尋樹要容易得多,因為搜尋的結果使

要刪除的節點挪到了根上,之後的操作很巧妙:在左子樹中反過來搜尋根,這樣做的結果是左兒子的右子樹因為旋轉而消失了,於是可以把根的右子樹接到左兒子上,根自然被刪除。

關於自頂向下伸展樹的操作,原書中給出了很簡潔漂亮的實現,由上面的例子可見一斑。

以下演示是一顆樹的逐節點刪除過程,用的是後文紅黑樹用的例子,對照一下這兩種樹的執行也很有趣:

伸展樹 (自頂向下的設計)

伸展樹的設計有兩種設計模式,第一種 自低向上的設計方式,第二種 設計方式 自頂向下的設計方式,對於由低向上的設計,每乙個結點樹保留指向其父結點的的額外的結點,第二種方式由sedgewick 大神的 演算法 一書感謝這一 位大神。伸展樹又叫自適應查詢樹,實質上二叉搜尋樹的的變形,允許各種型別的二叉樹操...

樹 自頂向下思路和自底向上思路求樹的最大深度

import static sun.swing.menuitemlayouthelper.max class treenode treenode int val treenode int val,treenode left,treenode right 自底向上解法 class maxdepth 自...

是否為平衡二叉樹(自頂向下 自底向上)

法1 暴力法 自頂向下 這種方法最容易想到,但是每乙個結點都會被遍歷多次,時間複雜度太高!class solution 求解二叉樹深度 intdepth treenode node 法2 自底向上 這是這道題的經典所在!思路是用後序遍歷二叉樹的每乙個結點,在遍歷到乙個結點時我們已經遍歷了它的左右子樹...