- 1、本文档共75页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
掌握利用先序和中序,中序和后序来建立一个二叉树 已知一个二叉树的先序和中序,怎样建立二叉树? 先序:- + a * b – c d / e f 中序:a + b * c – d – e / f 已知一个二叉树的后序和中序,怎样建立二叉树? 中序: a + b * c – d – e / f 后序: a b c d - * + e f / - 小 结 二叉树的二叉线索存储表示 typedef enum{Link,Thread}PointerTag;//Link==0 指针 Thread==1 线索 typedef struct BiThrNode{ TElemType data; Struct BiThrNode *lchild,*right; PointerTag LTag,RTag; }BiThrNode,*BiThrTree; 小 结 二 树与二叉树的转换 二叉树与树都可用二叉链表存贮,以二叉链表作中介,可导出树与二叉树之间的转换。 树与二叉树转换方法 树 根 结点X的第一个孩子 结点X紧邻的右兄弟 二叉树 根 结点X的左孩子 结点X的右孩子 树 根 结点X的第一个孩子 结点X紧邻的右兄弟 二叉树 根 结点X的左孩子 结点X的右孩子 I A C B D H G F E F I A B D H G C E 三 树的遍历先根遍历 先访问根,然后依次先根遍历每一颗子树。例 先根遍历序列 A B E F C G D H I 后根遍历 依次后根遍历根的每一颗子树,然后访问根。后根遍历序列 E F B G C H I D A 树的先根遍历 对应二叉树的先序遍历;树的后根遍历 对应二叉树的中序遍历。不论是先根遍历还是后根遍历都是对树按深度方向的遍历,也可按宽度方向(按层)遍历树。 I A C B D H G F E 四 森林 森林:树的集合 将森林中树的根看成兄弟,可用树孩子兄弟表示法存储森林;用树与二叉树的转换方法,进行森林与二叉树转换;可用树的遍历方法对森林进行遍历; J O P N M L K I A C B D H G F E 包含两棵树的森林 小 结 以中序遍历为例,将中序序列中每个结点前趋、后继信息保存起来,以后再遍历二叉树时就可以根据所保存的结点前趋、后继信息对二叉树进行遍历。加上结点前趋后继信息(线索)的二叉树称为线索二叉树; 二叉树与树都可用二叉链表存贮,以二叉链表作中介,可导出树与二叉树之间的转换; 若二叉树非空 (1)访问根结点; (2)先序遍历左子树 (3)先序遍历右子树; 二. 遍历的递归算法 先序遍历(DLR)的定义: 上面先序遍历的定义等价于: 若二叉树为空,结束 ——基本项(也叫终止项) 若二叉树非空 ——递归项 (1)访问根结点; (2)先序遍历左子树 (3)先序遍历右子树; 先序遍历递归算法?void PreOrderTraverse(BiTree T, Status(*Visit)(TElemType e)) {//采用二叉链表存贮二叉树, visit( )是访问结点的函数。 //本算法先序遍历以T为根结点指针的二叉树 if (T) { // 若二叉树不为空, Visit(T-data); //访问根结点 PreOrderTraverse(T-lchild, Visit); //先序遍历T的左子树, PreOrderTraverse(T-rchild, Visit); //先序遍历T的右子树}//PreOrderTraverse 最简单的Visit函数是: Status PrintElement(TElemType e) { //输出元素e的值 printf(e); return OK; } ∧ D A B ∧ C ∧ ∧ E ∧ ∧ F ∧ T 2 中序遍
文档评论(0)