數(shù)據(jù)結(jié)構(gòu) C語言版 第二版(嚴(yán)蔚敏) 第5章樹和二叉樹 答案
《數(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< 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、< 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 6.煤礦安全生產(chǎn)科普知識競賽題含答案
- 2.煤礦爆破工技能鑒定試題含答案
- 3.爆破工培訓(xùn)考試試題含答案
- 2.煤礦安全監(jiān)察人員模擬考試題庫試卷含答案
- 3.金屬非金屬礦山安全管理人員(地下礦山)安全生產(chǎn)模擬考試題庫試卷含答案
- 4.煤礦特種作業(yè)人員井下電鉗工模擬考試題庫試卷含答案
- 1 煤礦安全生產(chǎn)及管理知識測試題庫及答案
- 2 各種煤礦安全考試試題含答案
- 1 煤礦安全檢查考試題
- 1 井下放炮員練習(xí)題含答案
- 2煤礦安全監(jiān)測工種技術(shù)比武題庫含解析
- 1 礦山應(yīng)急救援安全知識競賽試題
- 1 礦井泵工考試練習(xí)題含答案
- 2煤礦爆破工考試復(fù)習(xí)題含答案
- 1 各種煤礦安全考試試題含答案