数据结构与算法第六章课后答案第六章 树和二叉树
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第6章 树和二叉树(参考答案)
6.1
(1)根结点a
6.2
三个结点的树的形态: 三个结点的二叉树的形态:
(1) (1) (2) (4) (5)
6.3 设树的结点数是n ,则
n=n0+n1+n2+……+nm+ (1)
设树的分支数为B ,有
n=B+1
n=1n1+2n2+……+mnm+1 (2)
由(1)和(2)有:
n0=n2+2n3+……+(m-1)nm+1
6.4
(1) k i-1 (i 为层数)
(2) (n-2)/k+1
(3) (n-1)*k+i+1
(4) (n-1)%k !=0; 其右兄弟的编号 n+1
6.5(1)顺序存储结构
注:#为空结点
6.6
(1) 前序 ABDGCEFH
(2) 中序 DGBAECHF
(3) 后序 GDBEHFCA
6.7
(1) 空二叉树或任何结点均无左子树的非空二叉树
(2) 空二叉树或任何结点均无右子树的非空二叉树
(3) 空二叉树或只有根结点的二叉树
6.8
int height(bitree bt)
// bt是以二叉链表为存储结构的二叉树,本算法求二叉树bt的高度
{ int bl,br; // 局部变量,分别表示二叉树左、右子树的高度
if (bt==null) return(0);
else { bl=height(bt->lchild);
br=height(bt->rchild);
return(bl>br? bl+1: br+1); // 左右子树高度的大者加1(根) }
}// 算法结束
6.9
void preorder(cbt[],int n,int i);
// cbt是以完全二叉树形式存储的n个结点的二叉树,i是数
// 组下标,初始调用时为1。本算法以非递归形式前序遍历该二叉树
{ int i=1,s[],top=0; // s是栈,栈中元素是二叉树结点在cbt中的序号 // top是栈顶指针,栈空时top=0
if (n<=0) { printf(“输入错误”);exit(0);}
while (i<=n ||top>0)
{ while(i<=n)
{visit(cbt[i]); // 访问根结点
if (2*i+1<=n) s[++top]=2*i+1; //若右子树非空,其编号进栈
i=2*i;// 先序访问左子树
}
if (top>0) i=s[top--]; // 退栈,先序访问右子树
} // END OF while (i<=n ||top>0)
}// 算法结束
//以下是非完全二叉树顺序存储时的递归遍历算法,“虚结点”用‘*’表示void preorder(bt[],int n,int i);
// bt是以完全二叉树形式存储的一维数组,n是数组元素个数。i是数
// 组下标,初始调用时为1。
{ if (i<=n && bt[i]!=’*’)
{ visit(bt[i]);
preorder(bt,n,2*i);
preorder(bt,n,2*i+1);
}// 算法结束
6.10
int equal(bitree T1,bitree T2);
// T1和T2是两棵二叉树,本算法判断T1和T2是否等价
// T1和T2都是空二叉树则等价
// T1和T2只有一棵为空,另一棵非空,则不等价
// T1和T2均非空,且根结点值相等,则比较其左、右子树
{if (T1==null && T2==null) return(1); // 同为空二叉树
else if (T1==null || T2==null) return(0); // 只有一棵为空
else if (T1->data!=T2->data) return(0);// 根结点值不等
else return(equal(T1->lchild,T2->lchild)&&equal(T1->rchild,T2->rchild)) //判左右子树等价}// 算法结束
6.11
void levelorder (bitree ht);
{本算法按层次遍历二叉树ht}
{if (ht!=null)
{initqueue(q); {处始化队列,队列元素为二叉树结点的指针}
enqueue(q,ht); {根结点指针入队列}
while (!empty(q))
{ p=delqueue(q);
visit(p); // 访问结点
if (p->lchild!=null) enqueue (q,p->lchild);
//若左子女非空,则左子女入队列
if (p->rchild!=null) enqueue (q,p->rchild);
//若右子女非空,则右子女入队列
}
}
} // 算法结束
6.12
void preorder (bitree *t); (前序非递归遍历)
{ bitree *s[n+1]; // s是指针数组,数组中元素为二叉树节点的指针
top=0;
while (t!=null || top!=0)
{ while (t!=null) { visit(*t); s[++top]=t; t=t->lchild }
if (top!=0) { t=s[top--]; t=t->rchild;}
}
} // 算法结束
void inorder (bitree *t); (中序非递归遍历)
{bitree *s[n+1];
top=0;
while ((t!=null || top!=0)
{ while (t!=null) { s[++top]=t; t=t->lchild }
if (top!=0) { t=s[top--]; visit(*t); t=t->rchild; }
} // 算法结束
void postorder (bitree *t); (后序非递归遍历)
{typedef struct node
{ bitree *t; tag:0..1
} stack;
stack s[n+1] ;
top=0;
while (t || top)
{ while (t) { s[++top].t=t; s[top].tag=0; t=t->lchild; }
while (top && s[top].tag==1) { printf(s[top--].t->data:3);}
if (top) { s[top].tag=1; t=s[top].t->rchild ;}
}
} // 算法结束