第06章_树与二叉树B分析.ppt

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

非递归的二叉树前序遍历: // 二叉树节点定义 typedef struct node { datatype data; struct node *lchild, *rchild }bintnode; typedef bintnode *bintree; // 栈结构定义 typedef struct stack { bintree data[100]; int top; //栈顶指针 }seqstack; // 进栈函数 void push(seqstack *s, bintree t) { s?data[++s?top]=t; } // 出栈函数 bintree pop(seqstack *s) { if (s?top !=-1) { s?top--; return (s?data[s?top+1]); } else return NULL; } * 非递归的二叉树前序遍历: // 非递归实现二叉树的前序遍历 void preorder1(bintree t) { seqstack s; s.top = -1; // 当前处理的子树不为空或栈不为空则循环 while ( (t) || (s.top !=-1) ) { while (t) { printf(“%f”, t?data); s.top++; s.data[s.top] = t; t = t?lchild; }//endwhile if (s.top-1) { t = pop(s); t = t?rchild; }//endif }//endwhile }//end preorder1 * 二叉树的重建 由二叉树的前序序列和中序序列可以唯一地确定一棵二叉树 由二叉树的后序序列和中序序列可以唯一地确定一棵二叉树 由二叉树的前序序列和后序序列不可唯一地确定一棵二叉树 *  仅知二叉树的前序序列“abcdefg” 不能唯一确定一棵二叉树, 如果同时已知二叉树的中序序列“cbdaegf”,则会如何? 由二叉树的前序和中序序列建树 二叉树的前序序列 二叉树的中序序列 左子树 左子树 右子树 右子树 根 根 * a b c d e f g c b d a e g f a a b b c c d d e e f f g g a b c d e f g ^ ^ ^ ^ ^ ^ ^ ^ 前序序列 中序序列 * 前序序列{ A B H F D E C K G } 中序序列{ H B D F A E K C G } * (Binary Tree Traversal) 6.5 线索二叉树 * 所以, 空指针数目=2n-(n-1)=n+1个。 证明:用二叉链表存储包含n个结点的二叉树,结点必有2n个链域(见二叉链表数据类型说明)。 除根结点外,二叉树中每一个结点有且仅有一个双亲,意即每个结点地址占用了双亲的一个直接后继,n个结点地址共占用了n-1个双亲的指针域。也就是说,只会有n-1个结点的链域存放指针。 Threaded Binary Tree 讨论:用二叉链表法(l_child, r_child)存储包含n个结点的二叉树,结点的指针区域中会有多少个空指针? 有n+1个! 6.5 线索二叉树 * 结论:用二叉链表法存储包含n个结点的二叉树,结点的指针区域中会有n+1个空指针。 可以用它来存放当前结点的直接前驱和后继等线索,以加快查找速度。这就是线索二叉树的意义和用途。 疑问1:二叉树是1:2的非线性结构,如何定义其惟一的直接后继? 答:要遍历之后才能得到,且不同遍历算法得到的后继也不同。 先依遍历规则把每个结点对应的前驱或后继线索预存起来,这叫做“线索化”。 疑问2:获得这种“直接前驱”或“直接后继”有何意义? 答:从任一结点出发都能快速找到其前驱和后继,且不必借助堆栈 疑问3:如何经济的(预先)存放这类信息? 答:左孩子/前驱复用,右孩子/后继复用,后者称之为线索 * lchild LTag data RTag rchild 约定: 当Tag域为0时,表示正常情况; 当Tag域为1时,表示线索情况. 前驱(后继) 左(右)孩子 为识别复用的两种不同信息,特增加两个标志域: 问:增加了前驱和后继等线索有什么好处? ——能方便找出当前结点的前驱和后继,不用堆栈(递归)也能遍历整个树。 各1bit

文档评论(0)

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

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

1亿VIP精品文档

相关文档