- 1、本文档共94页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
第5章树和二叉树;教学目标;主要内容;5.1树和二叉树的定义;树是n个结点的有限集;凹入表示;根
叶子
森林
有序树
无序树;——即上层的那个结点(直接前驱)
——即下层结点的子树的根(直接后继)
——同一双亲下的同层结点(孩子之间互称兄弟)
——即双亲位于同一层的结点(但并非同一双亲)
——即从根到该结点所经分支的所有结点
——即该结点下层子树中的任一结点;——即树的数据元素
——结点挂接的子树数;二叉树(BinaryTree)是n(n≥0)个结点所构成的集合,它或为空树(n?=?0);或为非空树,对于非空树T:
(1)有且仅有一个称之为根的结点;
(2)除根结点以外的其余结点分为两个互不相交的子集T1和T2,分别称为T的左子树和右子树,且T1和T2本身又都是二叉树。;普通树(多叉树)若不转化为二叉树,则运算很难实现;二叉树基本特点:
结点的度小于等于2
有序树(子树有序,不能颠倒);4/8/2019;4/8/2019;5.2树和二叉树的抽象数据类型定义;CreateBiTree(T,definition)
初始条件;definition给出二叉树T的定义。
操作结果:按definition构造二叉树T。
PreOrderTraverse(T)
初始条件:二叉树T存在。
操作结果:先序遍历T,对每个结点访问一次。
InOrderTraverse(T)
初始条件:二叉树T存在。
操作结果:中序遍历T,对每个结点访问一次。
PostOrderTraverse(T)
初始条件:二叉树T存在。
操作结果:后序遍历T,对每个结点访问一次。;5.3二叉树的性质和存储结构;深度为5的完全二叉树的结点数不可能是;;4/8/2019;4/8/2019;满二叉树:一棵深度为k且有2k-1个结点的二叉树。(特点:每层都“充满”了结点)
;满二叉树是叶子一个也不少的树,而完全二叉树虽然前n-1层是满的,但最底层却允许在右边缺少连续若干个结点。满二叉树是完全二叉树的一个特例。;深度为7的完全二叉树中共有125个结点,则该完全二叉树中的叶子结点数为();性质4:具有n个结点的完全二叉树的深度必为
?log2n??+?1;4/8/2019;性质5:对完全二叉树,若从上至下、从左至右编号,则编号为i的结点,其左孩子编号必为2i,其右孩子编号必为2i+1;其双亲的编号必??i/2。;二叉树的顺序存储;abcde0000fg;;A;分析:必有2n个链域。除根结点外,每个结点有且仅有一个双亲,所以只会有n-1个结点的链域存放指针,指向非空子女结点。;三叉链表;5.4遍历二叉树和线索二叉树;;先序遍历:
中序遍历:
后序遍历:;;DLR;则三种遍历算法可写出:;StatusPreOrderTraverse(BiTreeT){
if(T==NULL)returnOK;//空二叉树
else{
coutT-data;//访问根结点
PreOrderTraverse(T-lchild);//递归遍历左子树
PreOrderTraverse(T-rchild);//递归遍历右子树
}
}
;2019年4月8日;遍历的算法实现-中序遍历;中序遍历算法;遍历的算法实现-后序遍历;后序遍历算法;如图二叉树,后序序列为:;遍历算法的分析;如果去掉输出语句,从递归的角度看,三种算法是完全相同的,或说这三种算法的访问路径是相同的,只是访问结点的时机不同。;A;A;二叉树的建立(算法5.3);计算二叉树结点总数;计算二叉树叶子结点总数;计算二叉树深度;若二叉树中各结点的值均不相同,则:
由二叉树的前序序列和中序序列,或由其后序序列和中序序列均能唯一地确定一棵二叉树,
但由前序序列和后序序列却不一定能唯一地确定一棵二叉树。;某二叉树的前序序列为ABCD,中序序列为DCBA,则后序序列为;4/8/2019;思考;线索化二叉树;两种解决方法;1)若结点有左子树,则lchild指向其左孩子;
否则,lchild指向其直接前驱(即线索);;LTag:若LTag=0,lchild域指向左孩子;
若LTag=1,lchild域指向其前驱。
RTag:若RTag=0,rchild域指向右孩子;
若RTag=1,rchi
文档评论(0)