《DSAA》 12.1 自頂向下伸展樹

在許多應用中,當一個節點被訪問後,馬上就很可能再次被訪問到,研究表明這種情況比人們預料的要頻繁的多。所以伸展樹的基本想法是:當一個節點被訪問後,它就要通過一系列的旋轉被放到根上。
自頂向下伸展樹的搜索方式非常獨特,它實際上是一個拆了又裝的過程,這個過程被稱爲伸展:
最開始先新建兩顆空樹:L樹和R樹,用於緩存。在從原樹自頂向下搜索時,每一次迭代都將父節點以上的部分拆除,視情況接到兩旁的L樹或R樹上,直到搜索結束,這時用L樹和R樹接到到根上,而把根上原來的左右子樹分別接到L樹和R樹上,處理完畢。
此時的樹根就是所要尋找的節點,或者是一個最接近的節點。
值得一提的是:由於伸展樹的特性,它的刪除操作比其他的二叉搜索樹要容易得多,因爲搜索的結果使要刪除的節點挪到了根上,之後的操作很巧妙:在左子樹中反過來搜索根,這樣做的結果是左兒子的右子樹因爲旋轉而消失了,於是可以把根的右子樹接到左兒子上,根自然被刪除。
關於自頂向下伸展樹的操作,原書中給出了很簡潔漂亮的實現,由上面的例子可見一斑。
以下演示是一顆樹的逐節點刪除過程,用的是後文紅黑樹用的例子,對照一下這兩種樹的運行也很有趣:



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章