严蔚敏《数据结构(c语言版)习题集》答案第六章树和二叉树文库Word版

上传人:日度 文档编号:215887774 上传时间:2021-11-27 格式:DOCX 页数:19 大小:85.40KB
返回 下载 相关 举报
严蔚敏《数据结构(c语言版)习题集》答案第六章树和二叉树文库Word版_第1页
第1页 / 共19页
严蔚敏《数据结构(c语言版)习题集》答案第六章树和二叉树文库Word版_第2页
第2页 / 共19页
严蔚敏《数据结构(c语言版)习题集》答案第六章树和二叉树文库Word版_第3页
第3页 / 共19页
严蔚敏《数据结构(c语言版)习题集》答案第六章树和二叉树文库Word版_第4页
第4页 / 共19页
严蔚敏《数据结构(c语言版)习题集》答案第六章树和二叉树文库Word版_第5页
第5页 / 共19页
点击查看更多>>
资源描述

《严蔚敏《数据结构(c语言版)习题集》答案第六章树和二叉树文库Word版》由会员分享,可在线阅读,更多相关《严蔚敏《数据结构(c语言版)习题集》答案第六章树和二叉树文库Word版(19页珍藏版)》请在金锄头文库上搜索。

1、第六章 树和二叉树 6.33 int Is_Descendant_C(int u,int v)/在孩子存储结构上判断u是否v的子孙,是则返回1,否则返回0 if(u=v) return 1; else if(Lv) if (Is_Descendant(u,Lv) return 1; if(Rv) if (Is_Descendant(u,Rv) return 1; /这是个递归算法 return 0;/Is_Descendant_C 6.34 int Is_Descendant_P(int u,int v)/在双亲存储结构上判断u是否v的子孙,是则返回1,否则返回0 for(p=u;p!=v&p

2、;p=Tp); if(p=v) return 1; else return 0;/Is_Descendant_P 6.35 这一题根本不需要写什么算法,见书后注释:两个整数的值是相等的. 6.36 int Bitree_Sim(Bitree B1,Bitree B2)/判断两棵树是否相似的递归算法 if(!B1&!B2) return 1; else if(B1&B2&Bitree_Sim(B1-lchild,B2-lchild)&Bitree_Sim(B1-rchild,B2-rchild) return 1; else return 0;/Bitree_Sim 6.37 void PreO

3、rder_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 6.38 typedef struct BTNode* ptr; enum 0,1,2 mark; PM

4、Type; /有mark域的结点指针类型 void PostOrder_Stack(BiTree T)/后续遍历二叉树的非递归算法,用栈 PMType a; InitStack(S); /S的元素为PMType类型 Push (S,T,0); /根结点入栈 while(!StackEmpty(S) Pop(S,a); switch(a.mark) case 0: Push(S,a.ptr,1); /修改mark域 if(a.ptr-lchild) Push(S,a.ptr-lchild,0); /访问左子树 break; case 1: Push(S,a.ptr,2); /修改mark域 if

5、(a.ptr-rchild) Push(S,a.ptr-rchild,0); /访问右子树 break; case 2: visit(a.ptr); /访问结点,返回 /while/PostOrder_Stack分析:为了区分两次过栈的不同处理方式,在堆栈中增加一个mark域,mark=0表示刚刚访问此结点,mark=1表示左子树处理结束返回,mark=2表示右子树处理结束返回.每次根据栈顶元素的mark域值决定做何种动作. 6.39 typedef struct int data; EBTNode *lchild; EBTNode *rchild; EBTNode *parent; enum

6、 0,1,2 mark; EBTNode,EBitree; /有mark域和双亲指针域的二叉树结点类型 void PostOrder_Nonrecursive(EBitree T)/后序遍历二叉树的非递归算法,不用栈 p=T; while(p) switch(p-mark) case 0: p-mark=1; if(p-lchild) p=p-lchild; /访问左子树 break; case 1: p-mark=2; if(p-rchild) p=p-rchild; /访问右子树 break; case 2: visit(p); p-mark=0; /恢复mark值 p=p-parent;

7、 /返回双亲结点 /PostOrder_Nonrecursive分析:本题思路与上一题完全相同,只不过结点的mark值是储存在结点中的,而不是暂存在堆栈中,所以访问完毕后要将mark域恢复为0,以备下一次遍历. 6.40 typedef struct int data; PBTNode *lchild; PBTNode *rchild; PBTNode *parent; PBTNode,PBitree; /有双亲指针域的二叉树结点类型 void Inorder_Nonrecursive(PBitree T)/不设栈非递归遍历有双亲指针的二叉树 p=T; while(p-lchild) p=p-

8、lchild; /向左走到尽头 while(p) visit(p); if(p-rchild) /寻找中序后继:当有右子树时 p=p-rchild; while(p-lchild) p=p-lchild; /后继就是在右子树中向左走到尽头 else if(p-parent-lchild=p) p=p-parent; /当自己是双亲的左孩子时后继就是双亲 else p=p-parent; while(p-parent&p-parent-rchild=p) p=p-parent; p=p-parent; /当自己是双亲的右孩子时后继就是向上返回直到遇到自己是在其左子树中的祖先 /while/Ino

9、rder_Nonrecursive 6.41 int c,k; /这里把k和计数器c作为全局变量处理 void Get_PreSeq(Bitree T)/求先序序列为k的结点的值 if(T) c+; /每访问一个子树的根都会使前序序号计数器加1 if(c=k) printf(Value is %dn,T-data); exit (1); else Get_PreSeq(T-lchild); /在左子树中查找 Get_PreSeq(T-rchild); /在右子树中查找 /if/Get_PreSeq main() . scanf(%d,&k); c=0; /在主函数中调用前,要给计数器赋初值0

10、Get_PreSeq(T,k); ./main 6.42 int LeafCount_BiTree(Bitree T)/求二叉树中叶子结点的数目 if(!T) return 0; /空树没有叶子 else if(!T-lchild&!T-rchild) return 1; /叶子结点 else return Leaf_Count(T-lchild)+Leaf_Count(T-rchild);/左子树的叶子数加上右子树的叶子数/LeafCount_BiTree 6.43 void Bitree_Revolute(Bitree T)/交换所有结点的左右子树 T-lchildT-rchild; /交

11、换左右子树 if(T-lchild) Bitree_Revolute(T-lchild); if(T-rchild) Bitree_Revolute(T-rchild); /左右子树再分别交换各自的左右子树/Bitree_Revolute 6.44 int Get_Sub_Depth(Bitree T,int x)/求二叉树中以值为x的结点为根的子树深度 if(T-data=x) printf(%dn,Get_Depth(T); /找到了值为x的结点,求其深度 exit 1; else if(T-lchild) Get_Sub_Depth(T-lchild,x); if(T-rchild) G

12、et_Sub_Depth(T-rchild,x); /在左右子树中继续寻找 /Get_Sub_Depth int Get_Depth(Bitree T)/求子树深度的递归算法 if(!T) return 0; else m=Get_Depth(T-lchild); n=Get_Depth(T-rchild); return (mn?m:n)+1; /Get_Depth 6.45 void Del_Sub_x(Bitree T,int x)/删除所有以元素x为根的子树 if(T-data=x) Del_Sub(T); /删除该子树 else if(T-lchild) Del_Sub_x(T-lchild,x);

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号