日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【最详细】数据结构(C语言版 第2版)第五章课后习题答案 严蔚敏 等 编著

發(fā)布時間:2024/2/28 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【最详细】数据结构(C语言版 第2版)第五章课后习题答案 严蔚敏 等 编著 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

所有章節(jié)答案合集——>傳送門


1.選擇題
( 1)把一棵樹轉(zhuǎn)換為二叉樹后,這棵二叉樹的形態(tài)是() 。
A.唯一的
B.有多種
C.有多種,但根結點都沒有左孩子
D.有多種,但根結點都沒有右孩子
答案: A
解釋:因為二叉樹有左孩子、右孩子之分,故一棵樹轉(zhuǎn)換為二叉樹后,這棵二叉樹的
形態(tài)是唯一的。

( 2)由 3 個結點可以構造出多少種不同的二叉樹?()
A. 2 B . 3 C . 4 D . 5
答案: D

( 3)一棵完全二叉樹上有 1001 個結點,其中葉子結點的個數(shù)是() 。
A. 250 B . 500 C . 254 D . 501
答案: D
解釋:設度為 0 結點(葉子結點)個數(shù)為 A,度為 1 的結點個數(shù)為 B,度為 2 的結點個數(shù)為 C,有A=C+1, A+B+C=1001 ,可得 2C+B=1000 ,由完全二叉樹的性質(zhì)可得 B=0 或 1,又因為 C 為整數(shù),所以 B=0, C=500 , A=501 ,即有 501 個葉子結點。

( 4)一個具有 1025 個結點的二叉樹的高 h 為()。
A. 11 B . 10 C . 11 至 1025 之間 D. 10 至 1024 之間
答案: C
解釋:若每層僅有一個結點,則樹高 h 為 1025 ;且其最小樹高為 log 2 1025 + 1=11 , 即 h 在 11 至 1025 之間。

( 5)深度為 h 的滿 m叉樹的第 k 層有()個結點。 (1=<k=<h)
A. m^(k-1)
B. m^k-1
C. m^(h-1)
D. m^h-1
答案: A
解釋:深度為 h 的滿 m 叉樹共有 mh
-1 個結點,第 k 層有 m
k-1 個結點。

( 6)利用二叉鏈表存儲樹,則根結點的右指針是() 。
A.指向最左孩子 B .指向最右孩子 C .空 D .非空
答案: C
解釋:利用二叉鏈表存儲樹時,右指針指向兄弟結點,因為根節(jié)點沒有兄弟結點,故根節(jié)點的右指針指向空。

( 7)對二叉樹的結點從 1 開始進行連續(xù)編號,要求每個結點的編號大于其左、右孩子的編號,同一結點的左右孩子中,其左孩子的編號小于其右孩子的編號,可采用()遍歷實現(xiàn)編號。
A.先序 B. 中序 C. 后序 D. 從根開始按層次遍歷
答案: C
解釋:根據(jù)題意可知按照先左孩子、再右孩子、最后雙親結點的順序遍歷二叉樹,即后序遍歷二叉樹。

( 8)若二叉樹采用二叉鏈表存儲結構,要交換其所有分支結點左、右子樹的位置,利用()遍歷方法最合適。
A.前序 B.中序 C.后序 D .按層次
答案: C
解釋:后續(xù)遍歷和層次遍歷均可實現(xiàn)左右子樹的交換 ,不過層次遍歷的實現(xiàn)消耗比后續(xù)大,后序遍歷方法最合適。

( 9)在下列存儲形式中, ()不是樹的存儲形式?
A.雙親表示法 B .孩子鏈表表示法 C.孩子兄弟表示法 D.順序存儲表示法
答案: D
解釋:樹的存儲結構有三種:雙親表示法、孩子表示法、孩子兄弟表示法,其中孩子兄弟表示法是常用的表示法,任意一棵樹都能通過孩子兄弟表示法轉(zhuǎn)換為二叉樹進行存儲。

( 10)一棵非空的二叉樹的先序遍歷序列與后序遍歷序列正好相反,則該二叉樹一定滿
足()。
A.所有的結點均無左孩子
B .所有的結點均無右孩子
C.只有一個葉子結點
D .是任意一棵二叉樹
答案: C
解釋:因為先序遍歷結果是“中左右” ,后序遍歷結果是“左右中” ,當沒有左子樹時,
就是“中右”和“右中” ;當沒有右子樹時,就是“中左”和“左中” 。則所有的結點均無左
孩子或所有的結點均無右孩子均可,所以 A、B 不能選,又所有的結點均無左孩子與所有的結
點均無右孩子時,均只有一個葉子結點,故選 C。

( 11)設哈夫曼樹中有 199 個結點,則該哈夫曼樹中有()個葉子結點。
A. 99 B. 100
C. 101 D. 102
答案: B
解釋:在哈夫曼樹中沒有度為 1 的結點,只有度為 0(葉子結點)和度為 2 的結點。設葉子結點的個數(shù)為 n0,度為 2 的結點的個數(shù)為 n2,由二叉樹的性質(zhì) n0=n2+1 ,則總結點數(shù) n= n0+n2=2*n0-1 ,得到 n0=100 。

( 12)若 X 是二叉中序線索樹中一個有左孩子的結點,且 X 不為根,則 X 的前驅(qū)為() 。
A. X 的雙親
B. X 的右子樹中最左的結點
C. X 的左子樹中最右結點
D. X 的左子樹中最右葉結點
答案: C

( 13)引入二叉線索樹的目的是() 。
A.加快查找結點的前驅(qū)或后繼的速度
B.為了能在二叉樹中方便的進行插入與刪除
C.為了能方便的找到雙親
D.使二叉樹的遍歷結果唯一
答案: A

( 14)設 F 是一個森林, B 是由 F 變換得的二叉樹。若 F 中有 n 個非終端結點,則 B 中右指針域為空的結點有( )個。
A. n- 1 B. n C. n + 1 D. n + 2
答案: C

( 15)n( n≥2)個權值均不相同的字符構成哈夫曼樹, 關于該樹的敘述中, 錯誤的是 ( )。
A.該樹一定是一棵完全二叉樹
B.樹中一定沒有度為 1 的結點
C.樹中兩個權值最小的結點一定是兄弟結點
D.樹中任一非葉結點的權值一定不小于下一層任一結點的權值
答案: A
解釋:哈夫曼樹的構造過程是每次都選取權值最小的樹作為左右子樹構造一棵新的二叉
樹,所以樹中一定沒有度為 1 的結點、兩個權值最小的結點一定是兄弟結點、任一非葉結點
的權值一定不小于下一層任一結點的權值。


2.應用題

(1)試找出滿足下列條件的二叉樹
① 先序序列與后序序列相同②中序序列與后序序列相同
③ 先序序列與中序序列相同④中序序列與層次遍歷序列相同
答案:先序遍歷二叉樹的順序是“根—左子樹—右子樹” ,中序遍歷“左子樹—根—右
子樹”,后序遍歷順序是: “左子樹—右子樹―根",根據(jù)以上原則有
①或為空樹,或為只有根結點的二叉樹
② 或為空樹,或為任一結點至多只有左子樹的二叉樹.
③ 或為空樹,或為任一結點至多只有右子樹的二叉樹.
④或為空樹,或為任一結點至多只有右子樹的二叉樹


(2)設一棵二叉樹的先序序列: A B D F C E G H ,中序序列: B F D A G E H C
①畫出這棵二叉樹。
②畫出這棵二叉樹的后序線索樹。
③將這棵二叉樹轉(zhuǎn)換成對應的樹(或森林) 。
答案


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



方案 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
結論:哈夫曼編碼優(yōu)于等長二進制編碼


( 4)已知下列字符 A、 B、 C、D、E、 F、 G的權值分別為 3、 12 、7、4、 2、 8, 11,試
填寫出其對應哈夫曼樹 HT 的存儲結構的初態(tài)和終態(tài)。
答案:


3.算法設計題
以二叉鏈表作為二叉樹的存儲結構,編寫以下算法:
( 1)統(tǒng)計二叉樹的葉結點個數(shù)。
[ 題目分析 ] 如果二叉樹為空,返回 0,如果二叉樹不為空且左右子樹為空,返回 1,如果
二叉樹不為空,且左右子樹不同時為空,返回左子樹中葉子節(jié)點個數(shù)加上右子樹中葉子
節(jié)點個數(shù)。
[ 算法描述 ]

int LeafNodeCount(BiTree T) { if(T==NULL) return 0; // 如果是空樹,則葉子結點個數(shù)為 0 else if(T->lchild==NULL&&T->rchild==NULL) return 1; // 判斷結點是否是葉子結點(左孩子右孩子都為空) ,若是則返回 1 else return LeafNodeCount(T->lchild)+LeafNodeCount(T->rchild); }

( 2)判別兩棵樹是否相等
[ 算法描述 ]

int compareTree(TreeNode* tree1, TreeNode* tree2) //用分治的方法做,比較當前根,然后比較左子樹和右子樹 {bool tree1IsNull = (tree1==NULL); bool tree2IsNull = (tree2==NULL); if(tree1IsNull != tree2IsNull) { return 1; } if(tree1IsNull && tree2IsNull) {// 如果兩個都是 NULL ,則相等return 0; }// 如果根節(jié)點不相等,直接返回不相等,否則的話,看看他們孩子相等不相等if(tree1->c != tree2->c) { return 1; } return (compareTree(tree1->left,tree2->left)&compareTree(tree1->right,tree2->right)) (compareTree(tree1->left,tree2->right)&compareTree(tree1->right,tree2->left)); }// 算法結束

( 3)交換二叉樹每個結點的左孩子和右孩子。
[ 題目分析 ] 如果某結點左右子樹為空,返回,否則交換該結點左右孩子,然后遞歸交換
左右子樹。
[ 算法描述 ]

void ChangeLR(BiTree &T) { BiTree temp; if(T->lchild==NULL&&T->rchild==NULL) return; else { temp = T->lchild; T->lchild = T->rchild; T->rchild = temp; }// 交換左右孩子ChangeLR(T->lchild); //遞歸交換左子樹ChangeLR(T->rchild); //遞歸交換右子樹 }

( 4)設計二叉樹的雙序遍歷算法(雙序遍歷是指對于二叉樹的每一個結點來說,先訪問
這個結點,再按雙序遍歷它的左子樹,然后再一次訪問這個結點,接下來按雙序遍歷它的右
子樹)。[ 題目分析 ] 若樹為空,返回;若某結點為葉子結點,則僅輸出該結點;否則先輸出該結
點,遞歸遍歷其左子樹,再輸出該結點,遞歸遍歷其右子樹。
[ 算法描述 ]

void DoubleTraverse(BiTree T) { if(T == NULL) return; else if(T->lchild==NULL&&T->rchild==NULL) cout<<T->data; // 葉子結點輸出else { cout<<T->data; DoubleTraverse(T->lchild); // 遞歸遍歷左子樹cout<<T->data; DoubleTraverse(T->rchild); // 遞歸遍歷右子樹} }

( 5)計算二叉樹最大的寬度 (二叉樹的最大寬度是指二叉樹所有層中結點個數(shù)的最大值) 。 [ 題目分析 ] 求二叉樹高度的算法見上題。 求最大寬度可采用層次遍歷的方法, 記下各層
結點數(shù),每層遍歷完畢,若結點數(shù)大于原先最大寬度,則修改最大寬度。
[ 算法描述 ]

int Width(BiTree bt)// 求二叉樹 bt 的最大寬度 {if (bt==null) return (0); // 空二叉樹寬度為 0 else {BiTree Q[];//Q 是隊列,元素為二叉樹結點指針,容量足夠大front=1;rear=1;last=1; //front 隊頭指針 ,rear 隊尾指針 ,last 同層最右結點在隊列中的位置temp=0; maxw=0; //temp 記局部寬度 , maxw 記最大寬度Q[rear]=bt; // 根結點入隊列while(front<=last) {p=Q[front++]; temp++; // 同層元素數(shù)加 1 if (p->lchild!=null) Q[++rear]=p->lchild; // 左子女入隊if (p->rchild!=null) Q[++rear]=p->rchild; // 右子女入隊 if (front>last) // 一層結束,{last=rear; if(temp>maxw) maxw=temp; //last 指向下層最右元素 , 更新當前最大寬度temp=0; }//if }//while return (maxw); } }// 結束 width

( 6)用按層次順序遍歷二叉樹的方法,統(tǒng)計樹中具有度為 1 的結點數(shù)目。
[題目分析 ]
若某個結點左子樹空右子樹非空或者右子樹空左子樹非空,則該結點為度為 1 的結點
[算法描述 ]

int Level(BiTree bt) // 層次遍歷二叉樹,并統(tǒng)計度為 1 的結點的個數(shù) {int num=0; //num 統(tǒng)計度為 1 的結點的個數(shù)if(bt){QueueInit(Q); QueueIn(Q,bt);//Q 是以二叉樹結點指針為元素的隊列while(!QueueEmpty(Q)) {p=QueueOut(Q); cout<<p->data; // 出隊 , 訪問結點if(p->lchild && !p->rchild ||!p->lchild && p->rchild) num++; // 度為 1 的結點if(p->lchild) QueueIn(Q,p->lchild); // 非空左子女入隊if(p->rchild) QueueIn(Q,p->rchild); // 非空右子女入隊} //while(!QueueEmpty(Q)) }//if(bt) return(num); }// 返回度為 1 的結點的個數(shù)

( 7)求任意二叉樹中第一條最長的路徑長度,并輸出此路徑上各結點的值。
[ 題目分析 ] 因為后序遍歷棧中保留當前結點的祖先的信息,用一變量保存棧的最高棧頂
指針,每當退棧時,棧頂指針高于保存最高棧頂指針的值時,則將該棧倒入輔助棧中,輔助
棧始終保存最長路徑長度上的結點,直至后序遍歷完畢,則輔助棧中內(nèi)容即為所求。
[ 算法描述 ]

void LongestPath(BiTree bt)// 求二叉樹中的第一條最長路徑長度 {BiTree p=bt,l[],s[]; //l, s 是棧,元素是二叉樹結點指針, l 中保留當前最長路徑中的結點int i , top=0,tag[],longest=0; while(p || top>0) {while(p) {s[++top]=p;tag[top]=0; p=p->Lc;} // 沿左分枝向下if(tag[top]==1) // 當前結點的右分枝已遍歷{if(!s[top]->Lc && !s[top]->Rc) // 只有到葉子結點時,才查看路徑長度if(top>longest) {for(i=1;i<=top;i++) l[i]=s[i]; longest=top; top--;} // 保留當前最長路徑到 l 棧,記住最高棧頂指針,退棧} else if(top>0) {tag[top]=1; p=s[top].Rc;} // 沿右子分枝向下}//while(p!=null||top>0) }// 結束 LongestPath

( 8)輸出二叉樹中從每個葉子結點到根結點的路徑。
[ 題目分析 ] 采用先序遍歷的遞歸方法, 當找到葉子結點 *b 時,由于 *b 葉子結點尚未添加
到 path 中,因此在輸出路徑時還需輸出 b->data 值。
[ 算法描述 ]

void AllPath(BTNode *b,ElemType path[],int pathlen) {int i; if (b!=NULL) {if (b->lchild==NULL && b->rchild==NULL) //*b 為葉子結點{cout << " " << b->data << " 到根結點路徑 :" << b->data; for (i=pathlen-1;i>=0;i--) cout << endl; } else {path[pathlen]=b->data; // 將當前結點放入路徑中pathlen++; //路徑長度增 1 AllPath(b->lchild,path,pathlen); // 遞歸掃描左子樹AllPath(b->rchild,path,pathlen); // 遞歸掃描右子樹pathlen--; //恢復環(huán)境} }//if (b!=NULL) }// 算法結束

如果這篇博客對你產(chǎn)生了幫助,還請給給它點個贊哦~,讓更多的人看到它。

超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生

總結

以上是生活随笔為你收集整理的【最详细】数据结构(C语言版 第2版)第五章课后习题答案 严蔚敏 等 编著的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。