第四章-樹與二叉樹 ----習題
1.給定二叉樹如圖 A-1 所示。設 N 代表二叉樹的根, L 代表根結點的左子樹, R 代表根結點的右子樹。若遍歷後的結點序列是 3 , 1 , 7 , 5 , 6 , 2 , 4 ,則其遍歷方式是 D
-
LRN
-
NRL
-
RLN
-
RNL
- 前序遍歷:根結點 -> 左子樹 -> 右子樹
- 中序遍歷:左子樹 -> 根結點 -> 右子樹
- 後序遍歷:左子樹 -> 右子樹 -> 根結點
2.下列二叉排序樹中,滿足平衡二叉樹定義的是 B
① ② ③ ④
-
①
-
②
-
③
解析:根據平衡二叉樹的定義有,任意結點的左、右子樹高度差的絕對值不超過 1 。而其餘 3 個選項均可以找到不符合該條件的結點。在做題的過程中,如果答案不太明顯,可以把每個非葉結點的平衡因子都寫出來再進行判斷
3.已知一棵完全二叉樹的第 6 層(設根為第 1 層)有 8 個葉結點,則完全二叉樹的結點個 數最多是111
解析:畫圖,有規律
4.將森林轉換為對應的二叉樹,若在二叉樹結點中,結點m是結點n的雙親結點的雙親結點,則在原來的森林中,m和n可能具有的關係是____。 答:1和3
1.父子關係
2.m的雙親結點與n的雙親結點是兄弟關係
3.兄弟關係
解析:樹轉換為二叉樹
(1)加線。在所有兄弟結點之間加一條連線。
(2)去線。樹中的每個結點,只保留它與第一個孩子結點的連線,刪除它與其它孩子結點之間的連線。
(3)層次調整。以樹的根節點為軸心,將整棵樹順時針旋轉一定角度,使之結構層次分明。(注意第一個孩子是結點的左孩子,兄弟轉換過來的孩子是結點的右孩子)
森林轉換為二叉樹
(1)把每棵樹轉換為二叉樹。
(2)第一棵二叉樹不動,從第二棵二叉樹開始,依次把後一棵二叉樹的根結點作為前一棵二叉樹的根結點的右孩子,用線連線起來。
二叉樹轉換為樹
是樹轉換為二叉樹的逆過程。
(1)加線。若某結點X的左孩子結點存在,則將這個左孩子的右孩子結點、右孩子的右孩子結點、右孩子的右孩子的右孩子結點…,都作為結點X的孩子。將結點X與這些右孩子結點用線連線起來。
(2)去線。刪除原二叉樹中所有結點與其右孩子結點的連線。
(3)層次調整。
二叉樹轉換為森林
假如一棵二叉樹的根節點有右孩子,則這棵二叉樹能夠轉換為森林,否則將轉換為一棵樹。
(1)從根節點開始,若右孩子存在,則把與右孩子結點的連線刪除。再檢視分離後的二叉樹,若其根節點的右孩子存在,則連線刪除…。直到所有這些根節點與右孩子的連線都刪除為止。
(2)將每棵分離後的二叉樹轉換為樹。
最終:
1) m 2)m 3)m 4)m
/ / \ \
/ \ / \
n n n n
爺爺 父子 叔侄 兄弟
5.下列線索二叉樹中(用虛線表示線索),符合後序線索樹定義的是(D)。
A B C D
-
A
-
B
-
C
-
D
- 解析:
題中所給二叉樹的後序序列為d,b,c,a。結點d無前驅和左子樹,左鏈域空,無右子樹,右鏈域指向其後繼結點b;結點b無左子樹,左鏈域指向其前驅結點d;結點c無左子樹,左鏈域指向其前驅結點b,無右子樹,右鏈域指向其後繼結點a。故選D。
6.在圖B-1所示的平衡二叉樹中,插入關鍵字48後得到一棵新平衡二叉樹。在新平衡二叉樹中,關鍵字37所在結點的左、右子結點中儲存的關鍵字分別是()。C
圖B-1
-
13,48
-
24,48
-
24,53
-
24,90
- 解析:
插入48以後,該二叉樹根結點的平衡因子由-1變為-2,在最小不平衡子樹根結點的右子樹(R)的左子樹(L)中插入新結點引起的不平衡屬於RL型平衡旋轉,需要做兩次旋轉操作(先右旋後左旋)。
調整後,關鍵字37所在結點的左、右子結點中儲存的關鍵字分別是24、53。
7.在一棵度為4的樹T中,若有20個度為4的結點,10個度為3的結點,1個度為2的結點,10個度為1的結點,則樹T的葉結點個數是()。B
-
41
-
82
-
113
-
122
- 解析:設樹中度為i(i=0,1,2,3,4)的結點數分別為Ni,樹中結點總數為N,則樹中各結點的度之和等於N-1,即N=1+N1+2N2+3N3+4N4=N0+N1+N2+N3+N4,根據題設中的資料,即可得到N0=82,即樹T的葉結點的個數是82
8.對n(n大於等於2)個權值均不相同的字元構成哈夫曼樹,關於該樹的敘述中,正確的是()
-
樹中一定沒有度為1的結點
-
該樹一定是一棵完全二叉樹
-
樹種任一非葉結點的權值一定不小於下一任一結點的權值
-
樹中兩個權值最小的結點一定是兄弟結點
- 解析:
A:在形成哈夫曼樹過程中,發現都是兩節點結合,形成一個根節點,所以沒有度為1的節點
B:不能保證,多看幾棵哈弗曼樹就能發現
C:對的,記住是兩個節點結合,形成一個新節點
D:第一步就是找到兩個最小節點形成新節點
9.若一棵完全二叉樹有768 個結點,則該二叉樹中葉結點的個數是( )。C
10. 若一棵二叉樹的前序遍歷序列和後序遍歷序列分別為1,2,3,4和4,3,2,1,則該二叉樹的中序遍歷序列不會是()。
-
257
-
258
-
384
-
385
- 解析:畫圖一下就OK,第9層是滿的1-9層總共有511個節點,第10層有768 -511 = 257個葉節點,由257推出第9層有
- 256 / 2 = 128 =====> 128 +1 = 129 個非 葉節點, 所以第九層有256 -129 = 127個葉節點 所以 257 + 127 = 384
-
1,2,3,4
-
2,3,4,1
-
3,2,4,1
-
4,3,2,1
解析:
前序序列為NLR,後序序列為LRN,由於前序序列和後序序列剛好相反,故不可能存在一個結點同時存在左右孩子,即二叉樹的高度為4。1為根結點,由於根結點只能有左孩子(或右孩子),因此,在中序序列中,1或在序列首或在序列尾,ABCD皆滿足要求。僅考慮以1的孩子結點2為根結點的子樹,它也只能有左孩子(或右孩子),因此,在中序序列中,2或在序列首或序列尾,ABD皆滿足要求。
【另解】畫出各選項與題幹資訊所對應的二叉樹如下,故ABD均滿足。
11.已知一棵有 2011 個結點的樹,其葉結點個數為 116 ,該樹對應的二叉樹中無右孩子的結點個數是 。
-
115
-
116
-
1895
-
1896
- 解析:樹轉換為二叉樹時,樹中每一個分支結點的所有子結點中的最右子結點無右孩子,根結點轉換後也沒有右孩子,因此,對應的二叉樹中無右孩子的結點個數 = 分支結點數 +1=2011 - 116+ 1=1896 。通常本題應採用特殊法解,設題意中的樹是如下圖所示的結構,則對應的二叉樹中僅有前 115 個葉結點有右孩子,故無右孩子的結點個數 =2011 - 115=1896 。
12.對於下列關鍵字序列,不可能構成某二叉排序樹中一條查詢路徑的序列是()。
-
95,22,91,24,94,71
-
92,20,91,34,88,35
-
21,89,77,29,36,38
-
12,25,71,68,33,34
連結:在二叉排序樹中,左子樹結點值小於根結點,右子樹結點值大於根結點。在選項A中,當查詢到91後再向24查詢,說明這一條路徑(左子樹)之後查詢的數都要比91小,而後面卻查詢到了94(解題過程中,建議配合畫圖),因此錯誤。
【畫圖法】各選項對應的查詢過如下圖,BCD對應的查詢樹都是二叉排序樹,A對應的查詢樹不是二叉排序樹,因為在91為根的左子樹中出現了比91大點的結點94。
13.若平衡二叉樹的高度為6,且所有非葉結點的平衡因子均為1,則該平衡二叉樹的結點總數為()。
-
10
-
20
-
32
-
33
- 解析:高度比較少,直接強畫就是了,如果高度比較高,用歸納法,這裡這是畫到了T4
14.若將關鍵字1,2,3,4,5,6,7 依次插入到初始為空的平衡二叉樹 T 中,則 T 中平衡因子為 0 的分支結點的個數是( )。
-
0
-
1
-
2
-
3
解析:
15.已知三叉樹T 中 6 個葉結點的權分別是 2,3,4,5,6,7, T 的帶權(外部)路徑長度最小是()
-
27
-
46
-
54
-
56
- 解析 :模擬霍夫曼最優二叉樹的編碼方法,考慮到最後一步編碼應當是三個元素一起編碼,因此編碼開始之前在最底層新增一個權為"0"的節點,從下至上以三元組編碼,最後可得該最優三叉樹,注意:節點偶數要加個0,奇數個就不用直接按照二叉樹哈夫曼的那種方法
- :
16.若X 是後序線索二叉樹中的葉結點,且 X 存在左兄弟結點 Y,則 X 的右線索指向的是( )。
-
X的父結點
-
以Y為根的子樹的最左下結點
-
X的左兄弟結點 Y
-
以Y為根的子樹的最右下結點
- 解析:
17.在任意一棵非空二叉排序樹T1中, 刪除某結點v之後形成二叉排序樹 T2,再將v 插入T2形成二叉排序樹T3。下列關於T1與T3的敘述中,正確的是( )。
I.若 v 是 T1的葉結點,則 T1 與 T3 不同
II. 若 v 是 T1的葉結點,則 T1與 T3相同
III.若 v 不是 T1 的葉結點,則 T1 與 T3 不同
IV.若v 不是 T1 的葉結點,則 T1 與 T3 相同
-
僅 I、 III
-
僅 I、 IV
-
僅 II、 III
-
僅 II、 IV
- 解析:葉節點可以直接刪除,而非葉節點刪除需要調整二叉樹。所以葉節點刪除再插入可以回到原位置,而非葉節點位置就會變了
- 二叉排序樹刪除操作:(建議畫圖一下就明白)
-
其刪除一個節點需要考慮對應節點的狀態,具體的說就是,是否存在左右節點,等等。需要按照以下情況討論。
1.查詢待刪除節點,在查詢的同時需要記錄一下待刪除節點的父親。
2.如果待刪除節點的左右節點都不存在,那麼直接刪除。
3.如果待刪除節點左子樹存在右子樹不存在,或者左子樹不存在右子樹存在。直接將其子樹中存在的一邊候補上來即可。
4.如果待刪除節點左右子樹都在,這個情況是最複雜的。需要按照二叉排序樹的性質從其左子樹或者有子樹中選擇節點補到待刪除節點的位置。
如果從左子樹中選,就應該選擇左子樹中最右邊的那個葉子節點(這裡肯定是葉子,如果不是葉子,那麼就不是最右邊的節點)
如果從右子樹中選,就應該選擇有子樹中最左邊的那個葉子節點。
-
18.若對如下的二叉樹進行中序線索化,則結點x的左、右線索指向的結點分別是 ()
-
e,c
-
e,a
-
d,c
-
b,a
解析:D。中序遍歷結果為debxac。所以x的前驅是b,後繼是a
19. 將森林F轉換為對應的二叉樹T,F中葉結點的個數等於 ()
-
T中葉結點的個數
-
T中度為1的結點個數
-
T中左孩子指標為空的結點個數
-
T中右孩子指標為空的結點個數
解析 :在二叉樹中,節點的左指標指向其孩子,節點的右指標指向其兄弟。所以在一顆二叉樹中,如果某個節點的左指標為NULL,就說明這個節點在原來的森林中沒有孩子,是葉子幾點,如果某個節點的右指標為NULL,就說明這個節點在原來的森林中沒有兄弟。
所以森林中的葉子節點=二叉樹中左指標為NULL的個數
20.若森林F有15條邊、25個結點,則F包含樹的個數是。
-
8
-
9
-
10
-
11
解析:樹有一個很重要的性質:在n個結點的樹中有n-1條邊,“那麼對於每棵樹,其結點數比邊數多1”。題中的森林中的結點數比邊數多10(即25-15=10),顯然共有10棵樹。
21.5個字元有如下4種編碼方案,不是字首編碼的是。
01,0000,0001,001,1
-
011,000,001,010,1
-
000,001,010,011,100
-
0,100,110,1110,1100
解析:
字首編碼的定義是在一個字符集中,任何一個字元的編碼都不是另一個字元編碼的字首。選項D中編碼110是編碼1100的字首,違反了字首編碼的規則,所以D不是字首編碼
22.先序序列為a,b,c,d 的不同二叉樹的個數是 () 。
-
13
-
14
-
15
-
16
解析:
根據二叉樹前序遍歷和中序遍歷的遞迴演算法中遞迴工作棧的狀態變化得出:前序序列和中序序列的關係相當於以前序序列為入棧次序,以中序序列為出棧次序。因為前序序列和中序序列可以唯一地確定一棵二叉樹,所以題意相當於“以序列 a,b,c,d 為入棧次序,則出棧序列的個數為?”,對於 n 個不同元素進棧,出棧序列的個數為 =14
用卡特蘭數
卡特蘭數的應用:
- 出棧次序
- n個節點的二叉樹構成
- 凸多邊形的三角形劃分
- 括號匹配,網格兩點之間抵達方案等
套公式:
C(2n,n)/(n+1)即可 1/(n+1) * C(2n,n)=1/5*(8,4)=(1/5)*((8*7*6*5)/(4*3*2*1))=(1/5)*70=14
23.下列選項給出的是從根分別到達兩個葉結點路徑上的權值序列,能屬於同一棵哈夫曼樹的是。D
-
24,10,5和24,10,7
-
24,10,5和24,12,
-
24,10,10和24,14,11
-
24,10,5和24,14,6
解析:A. B.
C.D.
C中4和4才是最小的,應該是0和4先構造,所以C也錯了。
24.現有一棵無重複關鍵字的平衡二叉樹(AVL樹),對其進行中序遍歷可得到一個降序序列。下列關於該平衡二叉樹的敘述中,正確的是。D
-
根結點的度一定為2
-
樹中最小元素一定是葉結點
-
最後插入的元素一定是葉結點
-
樹中最大元素一定是無左子樹
解析:只有兩個結點的平衡二叉樹的根結點的度為1,A錯誤。中序遍歷後可以得到一個降序序列,樹中最大元素一定無左子樹(可能有右子樹),因此不一定是葉結點,B錯誤,D對。最後插入的結點可能會導致平衡調整,而不一定是葉結點,C錯誤