当前位置:文档之家› 数据结构与算法第六章课后答案第六章 树和二叉树

数据结构与算法第六章课后答案第六章 树和二叉树

第6章 树和二叉树(参考答案)6.1(1)根结点a6.2三个结点的树的形态: 三个结点的二叉树的形态:(1) (1) (2) (4) (5)6.3 设树的结点数是n ,则n=n0+n1+n2+……+nm+ (1)设树的分支数为B ,有n=B+1n=1n1+2n2+……+mnm+1 (2)由(1)和(2)有:n0=n2+2n3+……+(m-1)nm+16.4(1) k i-1 (i 为层数)(2) (n-2)/k+1(3) (n-1)*k+i+1(4) (n-1)%k !=0; 其右兄弟的编号 n+16.5(1)顺序存储结构注:#为空结点6.6(1) 前序 ABDGCEFH(2) 中序 DGBAECHF(3) 后序 GDBEHFCA6.7(1) 空二叉树或任何结点均无左子树的非空二叉树(2) 空二叉树或任何结点均无右子树的非空二叉树(3) 空二叉树或只有根结点的二叉树6.8int 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.9void preorder(cbt[],int n,int i);// cbt是以完全二叉树形式存储的n个结点的二叉树,i是数// 组下标,初始调用时为1。

本算法以非递归形式前序遍历该二叉树{ int i=1,s[],top=0; // s是栈,栈中元素是二叉树结点在cbt中的序号 // top是栈顶指针,栈空时top=0if (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.10int 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.11void 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.12void 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 ;}}} // 算法结束6.13bitree *dissect(bitree **t,ElemType x)// 二叉树t至多有一个结点的数据域为x,本算法拆去以x为根的子树// 拆开后的第一棵树用t表示,成功拆开后返回第二棵二叉树{bitree *p,*find;if (*t!=null){ if ((*t)->data==x) // 根结点数据域为x{p=*t; *t=null;return(p);}else {find=(dissect(&(*t)->lchild),x); // 在左子树中查找并拆开// 若在左子树中未找到,就到右子树中查找并拆开if (!find) find=(dissect(&(*t)->rchild),x);return(find);}}else return(null); // 空二叉树} // 算法结束6.14int search(bitree t,ElemType x)// 设二叉树t中,值为x的结点至多一个,本算法打印x的所有祖先// 算法思想是,借助后序非递归遍历,用栈装遍历过程的结点,当查到// 值为x的结点时,栈中元素都是x的祖先{ typedef struct{ bitree p;int tag;}snode;snode s[];int top=0;while (t && t->data !=x || top){ while (t && t->data !=x) // 沿左分支向下{ s[++top].p=t; s[top].tag=0; t=t->lchild; }if (t->data==x) //{for (i=1;i<=top;++i) printf(“%c\n”,s[i].p->data);// 输出,设元素为字符 return(1);}elsewhile (top>0 && s[top].tag==1) top--;//退出右子树已访问的结点if (top>0) // 置访问标志1,访问右子树{s[top].tag=1;t=s[top].p; t=t->rchild; }}return(0); // 没有值为x的结点} // 算法结束6.15 中序序列后序序列前序序列 ABCDEFGH6.16null只有空指针处才能加线索。

6.17bitree *search(bitree *p)// 查找前序线索二叉树上给定结点p 的前序后继{ if (p->ltag==1) return(p->rchild); // 左标记为1时,若p 的右子树非空,p 的右子树的根p->rchild 为p 的后继;若右子树为空,p->rchild 指向后继else return(p->lchild); // 左标记为0时,p 的左子女p->lchild 为p 的后继 .} // 算法结束6.18 bitree *search (b :tree *p )//在后序线索二叉树中查找给定结点的后序前驱的算法{ if(p->rtag==0) return(p->rchild); //p 有右子女时,其右子女p->rchild 是p 的后序前驱else return(p->lchild);//p 的左标记为0,左子女p->l child 是后序前驱, 否则,线索p->lchild 指向p 的后序前驱}6.19前序序列:ABCDEFGHIJKLMPQRNO后序序列:BDEFCAIJKHGQRPMNOL6.216.227,19,2,6,32,3,21,10其对应字母分别为a,b,c,d,e,f,g,h。

哈夫曼编码:a:0010b:10c:00000d:0001e:01f:00001g:11h:0011。

相关主题