树和二叉树习题答案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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。