- 42
- 0
- 约1.99万字
- 约 16页
- 2016-10-16 发布于贵州
- 举报
数据结构课后答个人
数据结构作业(6—9章)
理学院 信计1001 孙建伟6.4 一棵深度为H的满k叉树有如下性质:第H层上的结点都是叶子结点,其余各层上每个结点都有k棵非空子树。如果按层次顺序从1开始对全部结点编号,问:
(1) 各层的结点数目是多少?
(2) 编号为p的结点的父结点(若存在)的编号是多少?
(3) 编号为p的结点的第i个儿子结点(若存在)的编号是多少?
(4) 编号为p的结点有右兄弟的条件是什么?其右兄弟的编号是多少?
解:(1)
(2)如果p是其双亲的最小的孩子(右孩子),则p减去根结点的一个结点,应是k的整数倍,该整数即为所在的组数,每一组为一棵满k叉树,正好应为双亲结点的编号。如果p是其双亲的最大的孩子(左孩子),则p+k-1为其最小的弟弟,再减去一个根结点,除以k,即为其双亲结点的编号。
综合来说,对于p是左孩子的情况,i=(p+k-2)/k;对于p是右孩子的情况,i=(p-1)/k
如果左孩子的编号为p,则其右孩子编号必为p+k-1,所以,其双亲结点的编号为
向下取整,如1.5向下取整为1
(3)结点p的右孩子的编号为kp+1,左孩子的编号为kp+1-k+1=k(p-1)+2,第i个孩子的编号为k(p-1)+2+i-1=kp-k+i+1。
(4)当(p-1)%k != 0时,结点p有右兄弟,其右兄弟的编号为p+1。
6.6 已知在一棵含有n个结点的树中,只有度为k的分支结点和度为0的叶子结点。试求该树含有的叶子节点数目。
解:利用上题结论易得结果。设度为k的结点个数为,则总结点数为。叶子结点的数目应等于总结点数减去度不为0的结点的数目,即
6.8 证明:一棵满k叉树上的叶子结点数和非叶子结点数之间满足以下关系:
解:一棵满k叉树的最后一层(深度为h)的结点数(叶子结点数)为,其总结点数为,则非叶子结点数,从而得
6.13 假设n和m为二叉树中两结点,用1、0或#(分别表示肯定、恰恰相反或不一定)填写下表:
问
已知 前序遍历时n在m前? 中序遍历时n在m前? 后序遍历时n在m前? n在m左方 n在m右左方 n是m祖先 n是m子孙 注:如果(1)离a和b最近的共同祖先p存在,且(2)a在p的左子树中,b在p的右子树中,则称a在b的左方(即b在a的右方)。
6.26 解:不妨设这8个结点为A、B、C、D、E、F、G、H,其相应的权为7、19、2、6、32、3、21、10。
A:1101 B:01 C:11111 D:1110 E:10 F:11110 G:00 H:1100
采用这种方式编码,电文最短。
6.33 解:
int Visit(int u,int v)
{
if(u==v) return 1;
if(L[v]==0){//左子树不存在
if(R[v]==0)//右子树也不存在
return 0;
else{// 右子树存在,继续访问右子树
if(Visit(u,R[v])) return 1;
else return 0;
}
}
else{// 左子树存在
if(Visit(u,L[v]))// 左子树中存在目标
return 1;
else{// 左子树中没有目标,需访问右子树
if(R[v]==0)// 没有右子树
return 0;
else{// 右子树存在,继续访问右子树
if(Visit(u,R[v])) return 1;
else return 0;
}
}
}
}
6.37 解:
// 先序遍历的非递归算法
Status POTraverse(BiTree T,Status (*Visit)(TElemType e))
{
BiTree p;
Stack s;
InitStack(s);
p=T;
while(p||!StackEmpty(s)){
if(p){
// 如果根指针不空,访问根结点,
// 右指针域压栈,继续遍历左子树
if(!Visit(p-data)) return ERROR;
Push(s,p-rchild);
p=p-lchild;
} // 根指针已空,本子树已遍历完毕,
// 退栈返回上一层,继续遍历未曾访问的结点
else Pop(s,p);
}
return OK;
}
6.42 解:
// 求二叉树中叶子结点的数目
Status POLeafNodeNum(int i,BiTree T)
{
if(T)
原创力文档

文档评论(0)