数据结构7树形结构_3.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
数据结构7树形结构_3

已知某二叉树的先序序列和中序序列构造二叉树算法: BTNode *CreateBT1(char *pre,char *in,int n) { BTNode *s; char *p; int k; if (n=0) return NULL; s=(BTNode *)malloc(sizeof(BTNode)); /*创建结点*s*/ s-data=*pre; for (p=in;pin+n;p++) /*在中序中找为*ppos的位置k*/ if (*p==*pre) break; k=p-in; s-lchild=CreateBT1(pre+1,in,k); /*递归构造左子树*/ s-rchild=CreateBT1(pre+k+1,p+1,n-k-1); /*构造右子树*/ return s; } 例7.16:已知某二叉树的后序序列为: b c j d a h i g f e 中序序列为: a c b d j e f h g i 构造二叉树并求其先序序列 后序 b c j d a h i g f e 中序 a c b d j e f h g i 后序规律:左子?右子?根 ∴树的根是 e 左后序: b c j d a 右后序: h i g f 右后序: b c j d 左后序: j b c b 右后序: h i g e a f d g c j b h i 已知某二叉树的后序序列和中序序列构造二叉树算法: BTNode *CreateBT2(char *post,char *in,int n,int m) { BTNode *s;char *p,*q,*maxp;int maxpost,maxin,k; if (n=0) return NULL; maxpost=-1; for (p=in;pin+n;p++) /*求in在post中最右边的那个字符*/ for (q=post;qpost+m;q++) /*在in中用maxp指向这个字符,用maxin标识它在in中的下标*/ if (*p==*q) { k=q-post; if (kmaxpost) { maxpost=k; maxp=p; maxin=p-in; } } 7.7 线索二叉树 7.7.1 线索二叉树的基本概念: 对二叉树进行某种遍历得到的结点序列,可以看作一个线性表。除第一个结点外,每个结点有且仅有一个前驱;除最后一个结点外每个结点有且仅有一个后继。为了区分不同遍历序列中的前驱和后继,通常冠以遍历的名称,如先序前驱、中序前驱、后序前驱、先序后继、中序后继、后序后继。 例如: A B C D G H E F 中序遍历序列: B G D A E H C F B 为中序遍历线性表的表头结点,它没有前驱,其中序后继结点为 G,G 结点的中序前驱为 B 结点。 具有n个结点的二叉树,有n-1条边,这些边指向自己的左、右孩子。即在二叉链表中的2n个孩子指针域里只用到n-1个域,还有另外n+1个指针域为空。 这个概念也可以这样理解:对于具有n个结点的二叉树,采用二叉链存储结构时,每个结点有两个指针域,总共有2n个指针域,又由于只有n-1个结点被有效指针所指向(n个结点中只有树根结点没有被有效指针域所指向),则共有2n-(n-1)=n+1个空链域。 若把每个结点中空的左子指针域和右子指针域用于分别指向某种遍历次序下的前驱结点或后继结点,在遍历二叉树时可由此信息直接找到在该遍历次序下的前驱和后继,从而提高遍历速度,节省空间。 * 7.4.3 二叉树遍历非递归算法:三种遍历都有两种非递归算法仅介绍其中一种 先序算法思路: 将根结点指针进栈,在栈不空时循环处理:出栈(指针存于p),访问指针 p指向的结点(访问是指输出该结点的 data 域值,扫描是指经由根结点找到该结点。在先序遍历时,扫描和访问是等价的,在中序遍历和后序遍历时,扫描不一定是访问),将p的右孩子结点指针进栈(先进后出),再将左孩子结点指针进栈。 A B C D E F G 栈内变化 A 输出:A B ,B D C ,C C 的左、右结点指针均为空,入、出栈没有实际效果。 ,D F E ,E G E 的左结点指针为空不入栈 ,G G 的左右结点指针为空不入栈 ,F (a) 空栈

文档评论(0)

qwd513620855 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档