數(shù)據(jù)結(jié)構(gòu) C語言版 第二版(嚴(yán)蔚敏) 第5章樹和二叉樹 答案

上傳人:無*** 文檔編號:102306958 上傳時(shí)間:2022-06-06 格式:DOC 頁數(shù):7 大?。?6KB
收藏 版權(quán)申訴 舉報(bào) 下載
數(shù)據(jù)結(jié)構(gòu) C語言版 第二版(嚴(yán)蔚敏) 第5章樹和二叉樹 答案_第1頁
第1頁 / 共7頁
數(shù)據(jù)結(jié)構(gòu) C語言版 第二版(嚴(yán)蔚敏) 第5章樹和二叉樹 答案_第2頁
第2頁 / 共7頁
數(shù)據(jù)結(jié)構(gòu) C語言版 第二版(嚴(yán)蔚敏) 第5章樹和二叉樹 答案_第3頁
第3頁 / 共7頁

下載文檔到電腦,查找使用更方便

10 積分

下載資源

還剩頁未讀,繼續(xù)閱讀

資源描述:

《數(shù)據(jù)結(jié)構(gòu) C語言版 第二版(嚴(yán)蔚敏) 第5章樹和二叉樹 答案》由會員分享,可在線閱讀,更多相關(guān)《數(shù)據(jù)結(jié)構(gòu) C語言版 第二版(嚴(yán)蔚敏) 第5章樹和二叉樹 答案(7頁珍藏版)》請?jiān)谘b配圖網(wǎng)上搜索。

1、 ...wd... 第5章 樹和二叉樹 1.選擇題 〔1〕把一棵樹轉(zhuǎn)換為二叉樹后,這棵二叉樹的形態(tài)是〔 〕。 A.唯一的 B.有多種 C.有多種,但根結(jié)點(diǎn)都沒有左孩子 D.有多種,但根結(jié)點(diǎn)都沒有右孩子 答案:A 解釋:因?yàn)槎鏄溆凶蠛⒆?、右孩子之分,故一棵樹轉(zhuǎn)換為二叉樹后,這棵二叉樹的形態(tài)是唯一的。 〔2〕由3個結(jié)點(diǎn)可以構(gòu)造出多少種不同的二叉樹〔〕 A.2 B.3 C.4 D.5 答案:D 解釋:五種情況如下: 〔3〕一

2、棵完全二叉樹上有1001個結(jié)點(diǎn),其中葉子結(jié)點(diǎn)的個數(shù)是〔〕。 A.250 B.500 C.254 D.501 答案:D 解釋:設(shè)度為0結(jié)點(diǎn)〔葉子結(jié)點(diǎn)〕個數(shù)為A,度為1的結(jié)點(diǎn)個數(shù)為B,度為2的結(jié)點(diǎn)個數(shù)為C,有A=C+1,A+B+C=1001,可得2C+B=1000,由完全二叉樹的性質(zhì)可得B=0或1,又因?yàn)镃為整數(shù),所以B=0,C=500,A=501,即有501個葉子結(jié)點(diǎn)。 〔4〕一個具有1025個結(jié)點(diǎn)的二叉樹的高h(yuǎn)為〔〕。 A.11 B.10 C.11至1025之間D.10至1024之間 答案:C 解釋:假設(shè)每層僅有

3、一個結(jié)點(diǎn),則樹高h(yuǎn)為1025;且其最小樹高為?log21025?+1=11,即h在11至1025之間。 〔5〕深度為h的滿m叉樹的第k層有〔〕個結(jié)點(diǎn)。(1=

4、〕對二叉樹的結(jié)點(diǎn)從1開場進(jìn)展連續(xù)編號,要求每個結(jié)點(diǎn)的編號大于其左、右孩子的編號,同一結(jié)點(diǎn)的左右孩子中,其左孩子的編號小于其右孩子的編號,可采用〔〕遍歷實(shí)現(xiàn)編號。 A.先序 B. 中序 C. 后序 D. 從根開場按層次遍歷 答案:C 解釋:根據(jù)題意可知按照先左孩子、再右孩子、最后雙親結(jié)點(diǎn)的順序遍歷二叉樹,即后序遍歷二叉樹。 〔8〕假設(shè)二叉樹采用二叉鏈表存儲構(gòu)造,要交換其所有分支結(jié)點(diǎn)左、右子樹的位置,利用〔〕遍歷方法最適宜。 A.前序B.中序C.后序 D.按層次 答案:C 解釋:后續(xù)遍歷和層次遍歷均可實(shí)現(xiàn)左右子樹的交換,不過層次遍歷的實(shí)現(xiàn)消耗比后續(xù)

5、大,后序遍歷方法最適宜。 〔9〕在以下存儲形式中,〔〕不是樹的存儲形式 A.雙親表示法 B.孩子鏈表表示法C.孩子兄弟表示法D.順序存儲表示法 答案:D 解釋:樹的存儲構(gòu)造有三種:雙親表示法、孩子表示法、孩子兄弟表示法,其中孩子兄弟表示法是常用的表示法,任意一棵樹都能通過孩子兄弟表示法轉(zhuǎn)換為二叉樹進(jìn)展存儲。 〔10〕一棵非空的二叉樹的先序遍歷序列與后序遍歷序列正好相反,則該二叉樹一定滿足〔〕。 A.所有的結(jié)點(diǎn)均無左孩子 B.所有的結(jié)點(diǎn)均無右孩子 C.只有一個葉子結(jié)點(diǎn) D.是任意一棵二叉樹 答案:C 解釋:因?yàn)橄刃虮闅v結(jié)果是“中左右〞,后序遍歷結(jié)果是“左右中〞,當(dāng)

6、沒有左子樹時(shí),就是“中右〞和“右中〞;當(dāng)沒有右子樹時(shí),就是“中左〞和“左中〞。則所有的結(jié)點(diǎn)均無左孩子或所有的結(jié)點(diǎn)均無右孩子均可,所以A、B不能選,又所有的結(jié)點(diǎn)均無左孩子與所有的結(jié)點(diǎn)均無右孩子時(shí),均只有一個葉子結(jié)點(diǎn),應(yīng)選C。 〔11〕設(shè)哈夫曼樹中有199個結(jié)點(diǎn),則該哈夫曼樹中有〔 〕個葉子結(jié)點(diǎn)。 A.99B.100 C.101D.102 答案:B 解釋:在哈夫曼樹中沒有度為1的結(jié)點(diǎn),只有度為0〔葉子結(jié)點(diǎn)〕和度為2的結(jié)點(diǎn)。設(shè)葉子結(jié)點(diǎn)的個數(shù)為n0,度為2的結(jié)點(diǎn)的個數(shù)為n2,由二叉樹的性質(zhì)n0=n2+1,則總結(jié)點(diǎn)數(shù)n= n0+n2=2*n0-1,得到n0=100。 〔12〕假設(shè)X是二

7、叉中序線索樹中一個有左孩子的結(jié)點(diǎn),且X不為根,則X的前驅(qū)為〔〕。 A.X的雙親B.X的右子樹中最左的結(jié)點(diǎn) C.X的左子樹中最右結(jié)點(diǎn) D.X的左子樹中最右葉結(jié)點(diǎn) 答案:C 〔13〕引入二叉線索樹的目的是〔〕。 A.加快查找結(jié)點(diǎn)的前驅(qū)或后繼的速度 B.為了能在二叉樹中方便的進(jìn)展插入與刪除 C.為了能方便的找到雙親 D.使二叉樹的遍歷結(jié)果唯一 答案:A 〔14〕設(shè)F是一個森林,B是由F變換得的二叉樹。假設(shè)F中有n個非終端結(jié)點(diǎn),則B中右指針域?yàn)榭盏慕Y(jié)點(diǎn)有〔 〕個。 A.n?1 B.n C.n + 1 D.n + 2 答案:C 〔15〕n〔n≥2〕個權(quán)值均不一樣的

8、字符構(gòu)成哈夫曼樹,關(guān)于該樹的表達(dá)中,錯誤的選項(xiàng)是〔?〕。 A.該樹一定是一棵完全二叉樹 B.樹中一定沒有度為1的結(jié)點(diǎn) C.樹中兩個權(quán)值最小的結(jié)點(diǎn)一定是兄弟結(jié)點(diǎn) D.樹中任一非葉結(jié)點(diǎn)的權(quán)值一定不小于下一層任一結(jié)點(diǎn)的權(quán)值 答案:A 解釋:哈夫曼樹的構(gòu)造過程是每次都選取權(quán)值最小的樹作為左右子樹構(gòu)造一棵新的二叉樹,所以樹中一定沒有度為1的結(jié)點(diǎn)、兩個權(quán)值最小的結(jié)點(diǎn)一定是兄弟結(jié)點(diǎn)、任一非葉結(jié)點(diǎn)的權(quán)值一定不小于下一層任一結(jié)點(diǎn)的權(quán)值。 2.應(yīng)用題 〔1〕試找出滿足以下條件的二叉樹 ① 先序序列與后序序列一樣②中序序列與后序序列一樣 ③ 先序序列與中序序列一樣④中序序列與層次遍歷序列一樣

9、答案:先序遍歷二叉樹的順序是“根—左子樹—右子樹〞,中序遍歷“左子樹—根—右子樹〞,后序遍歷順序是:“左子樹—右子樹―根",根據(jù)以上原則有 ①或?yàn)榭諛?,或?yàn)橹挥懈Y(jié)點(diǎn)的二叉樹 ②或?yàn)榭諛洌驗(yàn)槿我唤Y(jié)點(diǎn)至多只有左子樹的二叉樹. ③或?yàn)榭諛?,或?yàn)槿我唤Y(jié)點(diǎn)至多只有右子樹的二叉樹. ④或?yàn)榭諛洌驗(yàn)槿我唤Y(jié)點(diǎn)至多只有右子樹的二叉樹 〔2〕設(shè)一棵二叉樹的先序序列: A B D F C E G H ,中序序列: B F D A G E H C ①畫出這棵二叉樹。 ②畫出這棵二叉樹的后序線索樹。 ③將這棵二叉樹轉(zhuǎn)換成對應(yīng)的樹〔或森林〕。 答案: A B F D ③

10、 C E H G ①② 〔3〕假設(shè)用于通信的電文僅由8個字母組成,字母在電文中出現(xiàn)的頻率分別為0.07,0.19,0.02,0.06,0.32,0.03,0.21,0.10。 ①試為這8個字母設(shè)計(jì)赫夫曼編碼。 ② 試設(shè)計(jì)另一種由二進(jìn)制表示的等長編碼方案。 ③對于上述實(shí)例,對比兩種方案的優(yōu)缺點(diǎn)。 答案:方案1;哈夫曼編碼 先將概率放大100倍,以方便構(gòu)造哈夫曼樹。 w={7,19,2,6,32,3,21,10},按哈夫曼規(guī)則:【[〔2,3〕,6], (7,10)】, ……19,21,32 〔100〕 〔40〕 〔60〕 19 21

11、 32 〔28〕 〔17〕〔11〕 7 10 6 〔5〕 2 3 0 1 0 1 0 1 19 21 32 0 1 0 1 0 1 7 10 6 0 1 2 3 方案對比: 字母編號 對應(yīng)編碼 出現(xiàn)頻率 1 000 0.07 2 001 0.19 3 010 0.02 4 011 0.06 5 100 0.32 6 101 0.03 7 110 0.21 8 111 0.10 字母編號 對應(yīng)編碼 出現(xiàn)頻率

12、 1 1100 0.07 2 00 0.19 3 11110 0.02 4 1110 0.06 5 10 0.32 6 11111 0.03 7 01 0.21 8 1101 0.10 方案1的WPL=2(0.19+0.32+0.21)+4(0.07+0.06+0.10)+5(0.02+0.03)=1.44+0.92+0.25=2.61 方案2的WPL=3(0.19+0.32+0.21+0.07+0.06+0.10+0.02+0.03)=3 結(jié)論:哈夫曼編碼優(yōu)于等長二進(jìn)制編碼 〔4〕以下字符A、B、C、D、E、F、G的權(quán)值分別為3、

13、12、7、4、2、8,11,試填寫出其對應(yīng)哈夫曼樹HT的存儲構(gòu)造的初態(tài)和終態(tài)。 答案: 初態(tài): ? weight parent lchild rchild 1 3 0 0 0 2 12 0 0 0 3 7 0 0 0 4 4 0 0 0 5 2 0 0 0 6 8 0 0 0 7 11 0 0 0 8 ? 0 0 0 9 ? 0 0 0 10 ? 0 0 0 11 ? 0 0 0 12 ? 0 0 0 13 ? 0 0 0 終態(tài): ? weigh

14、t parent lchild rchild 1 3 8 0 0 2 12 12 0 0 3 7 10 0 0 4 4 9 0 0 5 2 8 0 0 6 8 10 0 0 7 11 11 0 0 8 5 9 5 1 9 9 11 4 8 10 15 12 3 6 11 20 13 9 7 12 27 13 2 10 13 47 0 11 12 3.算法設(shè)計(jì)題 以二叉鏈表作為二叉樹的存儲構(gòu)造,編寫以下算法: 〔1〕統(tǒng)計(jì)二叉樹的葉結(jié)點(diǎn)個數(shù)。 [題目分析]

15、如果二叉樹為空,返回0,如果二叉樹不為空且左右子樹為空,返回1,如果二叉樹不為空,且左右子樹不同時(shí)為空,返回左子樹中葉子節(jié)點(diǎn)個數(shù)加上右子樹中葉子節(jié)點(diǎn)個數(shù)。 [算法描述] int LeafNodeCount(BiTree T) { if(T==NULL) return 0; //如果是空樹,則葉子結(jié)點(diǎn)個數(shù)為0 else if(T->lchild==NULL&&T->rchild==NULL) return 1; //判斷結(jié)點(diǎn)是否是葉子結(jié)點(diǎn)〔左孩子右孩子都為空〕,假設(shè)是則返回1 else return LeafNodeCount(T->lchild)+Leaf

16、NodeCount(T->rchild); } 〔2〕判別兩棵樹是否相等。 [題目分析]先判斷當(dāng)前節(jié)點(diǎn)是否相等(需要處理為空、是否都為空、是否相等),如果當(dāng)前節(jié)點(diǎn)不相等,直接返回兩棵樹不相等;如果當(dāng)前節(jié)點(diǎn)相等,那么就遞歸的判斷他們的左右孩子是否相等。 [算法描述] int compareTree(TreeNode* tree1, TreeNode* tree2) //用分治的方法做,對比當(dāng)前根,然后對比左子樹和右子樹 {bool tree1IsNull = (tree1==NULL); bool tree2IsNull = (tree2==NULL); if(tree1IsN

17、ull != tree2IsNull) { return 1; } if(tree1IsNull && tree2IsNull) {//如果兩個都是NULL,則相等 return 0; }//如果根節(jié)點(diǎn)不相等,直接返回不相等,否則的話,看看他們孩子相等不相等 if(tree1->c != tree2->c) {  return 1; } return (compareTree(tree1->left,tree2->left)&compareTree(tree1->right,tree2->right)) (compareTree(tree1->left,tree2-

18、>right)&compareTree(tree1->right,tree2->left)); }//算法完畢 〔3〕交換二叉樹每個結(jié)點(diǎn)的左孩子和右孩子。 [題目分析]如果某結(jié)點(diǎn)左右子樹為空,返回,否則交換該結(jié)點(diǎn)左右孩子,然后遞歸交換左右子樹。 [算法描述] void ChangeLR(BiTree &T) { BiTree temp; if(T->lchild==NULL&&T->rchild==NULL) return; else { temp = T->lchild; T->lchild = T->rchild; T->rchild =

19、temp; }//交換左右孩子 ChangeLR(T->lchild); //遞歸交換左子樹 ChangeLR(T->rchild); //遞歸交換右子樹 } 〔4〕設(shè)計(jì)二叉樹的雙序遍歷算法〔雙序遍歷是指對于二叉樹的每一個結(jié)點(diǎn)來說,先訪問這個結(jié)點(diǎn),再按雙序遍歷它的左子樹,然后再一次訪問這個結(jié)點(diǎn),接下來按雙序遍歷它的右子樹〕。 [題目分析]假設(shè)樹為空,返回;假設(shè)某結(jié)點(diǎn)為葉子結(jié)點(diǎn),則僅輸出該結(jié)點(diǎn);否則先輸出該結(jié)點(diǎn),遞歸遍歷其左子樹,再輸出該結(jié)點(diǎn),遞歸遍歷其右子樹。 [算法描述] void DoubleTraverse(BiTree T) { if(T == NULL)

20、 return; else if(T->lchild==NULL&&T->rchild==NULL) cout<data; //葉子結(jié)點(diǎn)輸出 else { cout<data; DoubleTraverse(T->lchild); //遞歸遍歷左子樹 cout<data; DoubleTraverse(T->rchild); //遞歸遍歷右子樹 } } 〔5〕計(jì)算二叉樹最大的寬度〔二叉樹的最大寬度是指二叉樹所有層中結(jié)點(diǎn)個數(shù)的最大值〕。 [題目分析] 求二叉樹高度的算法見上題。求最大寬度可采用層次遍

21、歷的方法,記下各層結(jié)點(diǎn)數(shù),每層遍歷完畢,假設(shè)結(jié)點(diǎn)數(shù)大于原先最大寬度,則修改最大寬度。 [算法描述] int Width(BiTree bt)//求二叉樹bt的最大寬度 {if (bt==null) return (0); //空二叉樹寬度為0 else {BiTree Q[];//Q是隊(duì)列,元素為二叉樹結(jié)點(diǎn)指針,容量足夠大 front=1;rear=1;last=1; //front隊(duì)頭指針,rear隊(duì)尾指針,last同層最右結(jié)點(diǎn)在隊(duì)列中的位置 temp=0; maxw=0; //temp記局部寬度, maxw記最大寬度 Q[rear]=bt;

22、 //根結(jié)點(diǎn)入隊(duì)列 while(front<=last) {p=Q[front++]; temp++; //同層元素?cái)?shù)加1 if (p->lchild!=null) Q[++rear]=p->lchild; //左子女入隊(duì) if (p->rchild!=null) Q[++rear]=p->rchild; //右子女入隊(duì) if (front>last) //一層完畢, {last=rear; if(temp>maxw) maxw=temp; //last指向下層最右元素, 更新當(dāng)前最大寬度 temp=0; }//if }/

23、/while return (maxw); }//完畢width 〔6〕用按層次順序遍歷二叉樹的方法,統(tǒng)計(jì)樹中具有度為1的結(jié)點(diǎn)數(shù)目。 [題目分析] 假設(shè)某個結(jié)點(diǎn)左子樹空右子樹非空或者右子樹空左子樹非空,則該結(jié)點(diǎn)為度為1的結(jié)點(diǎn) [算法描述] int Level(BiTree bt) //層次遍歷二叉樹,并統(tǒng)計(jì)度為1的結(jié)點(diǎn)的個數(shù) {int num=0; //num統(tǒng)計(jì)度為1的結(jié)點(diǎn)的個數(shù) if(bt){QueueInit(Q); QueueIn(Q,bt);//Q是以二叉樹結(jié)點(diǎn)指針為元素的隊(duì)列 while(!QueueEmpty(Q)) {p=QueueOut(Q); cout

24、<data; //出隊(duì),訪問結(jié)點(diǎn) if(p->lchild && !p->rchild ||!p->lchild && p->rchild)num++; //度為1的結(jié)點(diǎn) if(p->lchild) QueueIn(Q,p->lchild); //非空左子女入隊(duì) if(p->rchild) QueueIn(Q,p->rchild); //非空右子女入隊(duì) } //while(!QueueEmpty(Q)) }//if(bt) return(num); }//返回度為1的結(jié)點(diǎn)的個數(shù) 〔7〕求任意二叉樹中第一條最長的路徑長度,并輸出此路徑上各結(jié)點(diǎn)

25、的值。 [題目分析]因?yàn)楹笮虮闅v棧中保存當(dāng)前結(jié)點(diǎn)的祖先的信息,用一變量保存棧的最高棧頂指針,每當(dāng)退棧時(shí),棧頂指針高于保存最高棧頂指針的值時(shí),則將該棧倒入輔助棧中,輔助棧始終保存最長路徑長度上的結(jié)點(diǎn),直至后序遍歷完畢,則輔助棧中內(nèi)容即為所求。 [算法描述] void LongestPath(BiTree bt)//求二叉樹中的第一條最長路徑長度 {BiTree p=bt,l[],s[]; //l, s是棧,元素是二叉樹結(jié)點(diǎn)指針,l中保存當(dāng)前最長路徑中的結(jié)點(diǎn) int i,top=0,tag[],longest=0; while(p || top>0) {while(p) {s[+

26、+top]=p;tag[top]=0; p=p->Lc;} //沿左分枝向下 if(tag[top]==1) //當(dāng)前結(jié)點(diǎn)的右分枝已遍歷 {if(!s[top]->Lc && !s[top]->Rc) //只有到葉子結(jié)點(diǎn)時(shí),才查看路徑長度 if(top>longest) {for(i=1;i<=top;i++) l[i]=s[i]; longest=top; top--;} //保存當(dāng)前最長路徑到l棧,記住最高棧頂指針,退棧 } else if(top>0) {tag[top]=1; p=s[top].Rc;} //沿右子分枝向下 }//while(p!=null

27、||top>0) }//完畢LongestPath 〔8〕輸出二叉樹中從每個葉子結(jié)點(diǎn)到根結(jié)點(diǎn)的路徑。 [題目分析]采用先序遍歷的遞歸方法,當(dāng)找到葉子結(jié)點(diǎn)*b時(shí),由于*b葉子結(jié)點(diǎn)尚未添加到path中,因此在輸出路徑時(shí)還需輸出b->data值。 [算法描述] void AllPath(BTNode *b,ElemType path[],int pathlen) {int i; if (b!=NULL) {if (b->lchild==NULL && b->rchild==NULL) //*b為葉子結(jié)點(diǎn) {cout << " " << b->data << "到根結(jié)點(diǎn)路徑:" <<

28、 b->data; for (i=pathlen-1;i>=0;i--) cout << endl; } else {path[pathlen]=b->data; //將當(dāng)前結(jié)點(diǎn)放入路徑中 pathlen++; //路徑長度增1 AllPath(b->lchild,path,pathlen); //遞歸掃描左子樹 AllPath(b->rchild,path,pathlen); //遞歸掃描右子樹 pathlen--; //恢復(fù)環(huán)境 } }//if (b!=NULL) }//算法完畢

展開閱讀全文
溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

相關(guān)資源

更多
正為您匹配相似的精品文檔
關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號:ICP2024067431-1 川公網(wǎng)安備51140202000466號


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺,本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請立即通知裝配圖網(wǎng),我們立即給予刪除!