数据结构习题解析与实训 第六章.doc

  1. 1、本文档共15页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
数据结构习题解析与实训 第六章.doc

第 6 章 树和二叉树 这一章的重点是二叉树。 通过本章的习题可以在机器上运行程序,以验证二叉树的各种遍历算法和在二叉树 上的各种操作,包括二叉树左右子树交换、求二叉树叶子结点个数、求二叉树的深度、求某 结点的双亲结点等。 二叉树的存储结构采用二叉链表,结构如下所示。 #defineDATATYPE2char typedefstructnode1 {DATATYPE2data; structnode1*lchild,*rchild; }BTCHINALR; 要实现在二叉树上的各种操作,首先应将二叉树以上述的二叉链表结构在内存中建 立起来,而后在其上面进行各种操作。下面提供一个建立二叉树的函数,供各应用程序调 用,函数源程序以“二叉树.c”为名放在光盘上。“二叉树.c”源代码如下所示。 BTCHINALR*createbt() { BTCHINALR*q; structnode1*s[50];         intj,i,x; printf(″建立二叉树,输入结点对应的编号和值\n\n″); printf(″i,x=″); scanf(″%d,%c″,i,x); while(i!=0x!=′$′)  {q=(BTCHINALR*)malloc(sizeof(BTCHINALR));   /*建立一个新结点q*/ q-data=x;q-lchild=NULL;q-rchild=NULL; s[i]=q;             /*q新结点地址存入s指针数组中*/ if(i!=1)/*i=1,q结点是根结点*/  {j=i/2;/*否则求q结点的双亲结点的编号j*/ l62    数据结构习题解析与实训  if(i%2==0)s[j]-lchild=q;/*q结点编号为偶数则挂在双亲结点j的左边*/  elses[j]-rchild=q;}/*q结点编号为奇数则挂在双亲结点j的右边*/ printf(″i,x=″); scanf(″%d,%c″,i,x);} returns[1];/*返回根结点地址*/ } 下面举例说明二叉树的建立。设有一棵二叉树如图6.1(a)所示,将二叉树模拟为完 全二叉树从根开始对结点进行编号,编号从1开始,结果如图6.1(b)所示。在运行过程 中要求输入结点对应的编号和值时,请按图6.1(c)中的数据输入,最后以编号i=0;结点 值x=′$′结束 。 图6.1 二叉树的建立   6.1  习题解析  【习题 1 】 二叉树中序遍历 题目要求:对建立的二叉树进行中序遍历,并输出遍历结果。中序遍历算法可以用 递归算法实现,也可以用非递归算法实现。建立二叉树的函数放在“二叉树.c”源程序中。 以下各例中均如此。 【解答】 #includestdio.h #include″datastru.h″ #includemalloc.h #include″二叉树.c″ voidinorder(BTCHINALR*bt) /*中序遍历二叉树(递归算法)*/ {if(bt!=NULL)   { inorder(bt-lchild); 第6章 树和二叉树 l63     printf(″%c″,bt-data); inorder(bt-rchild); } } voidinorder_notrecursive(BTCHINALR*bt) /*中序遍历二叉树(非递归算法)*/ {BTCHINALR*q,*s[20];         int top=0; int bool=1; q=bt;  do{hile(q!=NULL)   { top++;s[top]=q;q=q-lchild;} if(top==0)bool=0; else{q=s[top];top--;   printf(″%c″,q-data);q=q-rchild;}  }while(bool); } main()  {TCHINALR*bt; charch; inti;  bt=createbt();i=1;  whil(i){ printf(″\n中序遍历二叉树(递归按y键,非递归按n键):″); fflush(stdin); scanf(″%c″,ch); if(ch==′y′)inorder(bt);elseinorder_notrecursive(bt); printf(″\n″); printf(″\n继续操作吗?(继续按1键,结束按0键):″); fflush(stdin); scanf(″%d″,i);  } } 【习题 2 】 求二叉树叶子结点数 题目要求:计算二叉树叶子结点数。计算二叉树叶子结点数的算法很多,既可用递 归算法实现,也可用非递归算法实现。该例用递归算法实现。 【解答】 #includestdio.h #include″d

文档评论(0)

gsgtshb + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档