1. 程式人生 > >平衡二叉樹插入—單旋轉雙旋轉問題

平衡二叉樹插入—單旋轉雙旋轉問題

平衡二叉樹插入一個節點時,往往會造成平衡二叉樹的不平衡,這時就要我們編寫程式恢復平衡二叉樹的平衡。下圖就因為插入了1,造成了樹的不平衡。

 

總的來說,消除不平衡有兩種方法,一個是單旋轉,另一個是雙旋轉,雙旋轉就是兩次單旋轉的疊加。我記得大二資料結構的教材是分了LR LL RR RL這四種情況討論。說實話,如此的說明方法,學生很難理解,書上全是些左旋轉,右旋轉搞得人一頭霧水。

重要的是:決定用哪個節點代替失衡節點,只有兩個選擇,失衡節點的兒子或者失衡節點的孫子。 

接下來就好辦了,無非就是互換一些子樹的一些指標而已。

下面看兩個例子:


我們看到,失衡節點都是3節點,左圖中,3的兒子是2,孫子是1,右圖正好相反。那我們用兒子節點還是孫子節點代替3節點呢?

左圖是用兒子代替3節點,右圖是用孫子代替3節點,這其中的規律是:判斷孫子節點的值是否介於兒子和3節點值之間,如果是,則孫子代替失衡節點,如果否,則用兒子代替失衡節點(相當做了兩個單旋轉,失衡節點的孫子先和失衡節點的兒子互換,然後失衡節點的兒子與失衡節點互換)。

下面我們來做個練習,先後在一顆平衡二叉樹中插入3,2,1,4~7, 16~10, 8,9


插入1時,我們知道只要用兒子代替失衡節點3即可

                          

當插入5時3節點失衡了,而且孫子並不是介於3和4 之間的,所以用兒子4代替3節點

                    

中間我省略了幾步,當插入15後,失衡節點是7,它的兒子是16,孫子是15。15是介於7和16的,所以我們用孫子15代替失衡節點。

後面的就留給大家自己鍛鍊一下吧,我就不一一說了。