樹學習(5)

王小東大將軍發表於2017-06-19

1.   二元查詢樹的任何結點的左右子樹都是二元查詢樹。

分析:二元查詢樹: 它首先要是一棵二元樹,在這基礎上它或者是一棵空樹;或者是具有下列性質的二元樹:(1)若左子樹不空,則左子樹上所有結點的值均小於它的根結點的值;(2)若右子樹不空,則右子樹上所有結點的值均大於它的根結點的值;(3)左、右子樹也分別為二元查詢樹

 

2.   樹中的結點和圖中的頂點就是指資料結構中的資料元素

 

3.   還原樹必須要包括中序序列在內的任意兩種序列。

 

4.   若二叉樹用二叉連結串列作儲存結構,則在n個結點的二叉樹連結串列中只有n-1個非空指標域。

 

補充:在一個包含n個結點的四叉樹,每個節點都有四個指向孩子結點的指標。這4n個指標中有3n+1個空指標。

分析:n個結點為一棵樹則有n-1條邊,因此有n-1個非空指標,所以空指標數目為4n-(n-1)=3n+1;

 

5.   在二叉樹結點的前序序列、中序序列和後序序列中,所有葉節點的先後順序:完全相同

分析:因為根據三個遍歷的次序和特點:前序是根左右、中序是左根右、後序是左右根,因此相對次序發生變化的都是子樹的根,也就是分支結點(或者說非葉子結點,度數>0)。葉結點的先後順序是不變的

變化的只是非葉子的結點位置,葉子結點的相對位置是不變的。

 

6.   平衡二叉樹中插入一個節點後造成不平衡,設最低的不平衡結點為A,並已知A的左孩子的平衡因子為0,右孩子的平衡因子為1,則應作RL調整以使其平衡。

分析:平衡因子=左子樹高度-右子樹高度。

LL:左子樹的左孩子上插入;LR左子樹的右孩子插入;以此類推,然後平衡因子的計算是左邊的減去右邊的。得出的值來判斷屬於前4種情況的哪一種,然後調整;LL往右邊轉,轉完以後缺哪補哪,RR往左邊轉。LR先右後左,RL先左後右。其中LR是先轉成LL,RL是先轉成RR

 

補充:若向平衡二叉樹中插入一個新結點後破壞了平衡二叉樹的平衡性。首先要找出插入新結點後失去平衡的最小子樹根結點的指標。然後再調整這個子樹中有關結點之間的連結關係,使之成為新的平衡子樹。當失去平衡的最小子樹被調整為平衡子樹後,原有其他所有不平衡子樹無需調整,整個二叉排序樹就又成為一棵平衡二叉樹。

 

失去平衡的最小子樹是指以離插入結點最近,且平衡因子絕對值大於1的結點作為根的子樹。假設用A表示失去平衡的最小子樹的根結點,則調整該子樹的操作可歸納為下列四種情況。

(1)LL型平衡旋轉法

由於在A的左孩子B的左子樹上插入結點F,使A的平衡因子由1增至2而失去平衡。故需進行一次順時針旋轉操作。即將A的左孩子B向右上旋轉代替A作為根結點,A向右下旋轉成為B的右子樹的根結點。而原來 B 的右子樹則變成A的左子樹。

(2)RR型平衡旋轉法

由於在A的右孩子C的右子樹上插入結點F,使A的平衡因子由-1減至-2而失去平衡。故需進行一次逆時針旋轉操作。即將A的右孩子C向左上旋轉代替A作為根結點,A向左下旋轉成為C的左子樹的根結點。而原來 C 的左子樹則變成A的右子樹。

(3)LR型平衡旋轉法

由於在A的左孩子B的右子數上插入結點F,使A的平衡因子由1增至2而失去平衡。故需進行兩次旋轉操作(先逆時針,後順時針)。即先將A結點的左孩子B的右子樹的根結點D向左上旋轉提升到B結點的位置,然後再把該D結點向右上旋轉提升到A結點的位置。即先使之成為LL型,再按LL型處理。

如圖中所示,即先將圓圈部分先調整為平衡樹,然後將其以根結點接到A的左子樹上,此時成為LL型,再按LL型處理成平衡型。

 

(4)RL型平衡旋轉法

由於在A的右孩子C的左子樹上插入結點F,使A的平衡因子由-1減至-2而失去平衡。故需進行兩次旋轉操作(先順時針,後逆時針),即先將A結點的右孩子C的左子樹的根結點D向右上旋轉提升到 C 結點的位置,然後再把該D結點向左上旋轉提升到A結點的位置。即先使之成為RR型,再按RR型處理。

如圖中所示,即先將圓圈部分先調整為平衡樹,然後將其以根結點接到A的左子樹上,此時成為RR型,再按RR型處理成平衡型。

 

平衡化靠的是旋轉。參與旋轉的是3個節點(其中一個可能是外部節點NULL),旋轉就是把這3個節點轉個位置。注意的是,左旋的時候p->right一定不為空,右旋的時候p->left一定不為空,這是顯而易見的。

 

如果從空樹開始建立,並時刻保持平衡,那麼不平衡只會發生在插入刪除操作上,而不平衡的標誌就是出現bf == 2或者bf == -2的節點。

7.   B系列樹,包括B樹、B+樹、B*樹,所有葉子節點都在同一層,所以左右子樹的高度都是相等的。

M階B-樹的任一個結點要麼有m個孩子,要麼沒有孩子。

 

8.   一個有n個結點的連通圖的生成樹是原圖的最小連通子圖,且包含原圖中所有n個結點,並且有保持圖連通的最少的邊。最大生成樹就是權和最大生成樹,現在給出一個無向帶權圖的鄰接矩陣,權為0表示沒有邊。{{0,4,5,0,3},{4,0,4,2,3},{5,4,0,2,0},{0,2,2,0,1},{3,3,0,1,0}},求這個圖的最大生成樹的權和。

分析:

利用kruskal,不同的是,這次我們按照從大到小的順序,從圖中選擇邊,同時保證選擇該邊不會與之前選過的邊組成一個迴路。最終選擇5 4 3 2 四條邊。

 

9.   樹的先序遍歷,如果採用非遞迴方式,需要用棧作為輔助空間。

深度優先搜尋藉助棧;廣度優先搜尋藉助佇列。

 

10. 二叉樹的形態個數就是卡特蘭數C(2n,n)/(n+1).對一顆二叉樹進行後序遍歷,輸出結果為A,B,C,這樣的二叉樹有5顆。

 

11. 根據“二叉樹T中任一結點V,其編號等於左子樹上最小編號減一,而V的右子樹的結點中,其最小編號等於V左子樹上結點的最大編號加1”可知符合前序遍歷的性質

 

相關文章