树和二叉树习题答案

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第六章 练习

1、试分别画出具有3个结点的树和3个结点的二叉树的所有不同形态。 态。 解:

(1)3个结点的树:

(2)3个结点的二叉树:

2、已知一棵度为m 的树中有个度为1的结点,个度为2 结点,…,个度为m 的结点,问该树中有多少个叶子结点?

解:由树的特征可知,除顶点外每个结点对应于一条边,总边数等于各顶点度数之和,所以有:

所以:

3、对第1题所得的各种形态的二叉树,分别写出前序、中序和后序遍历的序列。 解:

(1) 前:ABC 中:BAC 后:BCA (2) 前:ABC 中:CBA 后:CBA (3) 前:ABC 中:BCA 后:CBA (4) 前:ABC 中:ABC 后:CBA (5) 前:ABC 中:ACB 后:CBA

4、试以二叉链表作为存储结构,编写算法将二叉树中所有结点的左、右子树相互交换。

A

B

C

A B C

A

B C

A B C A

C

B A B C

A

C

B

void Bitree_Revolute(Bitree T)//交换所有结点的左右子树 {

T->lchild<->T->rchild; //交换左右子树 if(T->lchild) Bitree_Revolute(T->lchild); if(T->rchild) Bitree_Revolute(T->rchild); //左右子树再分别交换各自的左右子树

}//Bitree_Revolute

5、画出和下面树对应的二叉树:

A B

C

D

E

F

G

H

I

J

K

6、画出和下面二叉树对应的森林:

7、写出判断给定的二叉树是否是完全二叉树的算法。

int IsFull_Bitree(Bitree T)//判断二叉树是否完全二叉树,是则返回1,否则返回0 {

InitQueue(Q); flag=0;

EnQueue(Q,T); //建立工作队列 while(!QueueEmpty(Q))

{

DeQueue(Q,p);

if(!p) flag=1;

else if(flag) return 0;

else

{

EnQueue(Q,p->lchild);

EnQueue(Q,p->rchild); //不管孩子是否为空,都入队列

}

}//while

return 1;

}//IsFull_Bitree

分析:该问题可以通过层序遍历的方法来解决.不管当前结点是否有左右孩子,都入队列.这样当树为完全二叉树时,遍历时得到是一个连续的不包含空指针的序列.反之,则序列中会含有空指针.

8、根据栈的存储结构写出二叉树的非递归形式的先序遍历算法。

解:void PreOrder_Nonrecursive(Bitree T)//先序遍历二叉树的非递归算法{

InitStack(S);

Push(S,T); //根指针进栈

while(!StackEmpty(S))

{

while(Gettop(S,p)&&p)

{

visit(p->data);

push(S,p->lchild);

} //向左走到尽头

pop(S,p);

if(!StackEmpty(S))

{

pop(S,p);

push(S,p->rchild); //向右一步

}

}//while

}//PreOrder_Nonrecursive

9、假设用于通信的电文仅由8个字母组成,字母在电文中出现的频率分别为0.07,0.19,0.02,0.06,0.32,0.03,0.21,0.10。试为这8个字母设计哈夫曼编码。

所以这8个字符的哈夫曼编码分别为:

1010,00,10000,1001,11,10001,01,1011。

相关文档
最新文档