访问根结点、遍历右子树-数据结构.ppt

访问根结点、遍历右子树-数据结构.ppt

第6章 树和二叉树;第6章 树和二叉树;6.1 树的定义与基本术语;6.1 树的定义与基本术语;例如:一棵树的逻辑结构图(6.1)为:;2.树的图解表示法 ;3.树的相关术语:;双亲结点:一个结点的直接前驱称为该结点的双亲结点。上图中A是B、C的双亲。;4.树的抽象数据类型;基本操作:;基本操作:;6.2 二叉树;6.2.1 二叉树的定义与基本操作;二叉树的基本操作:;基本操作:;6.2.2 二叉树的性质;性质2:深度为k的二叉树至多有2k-1个结点(k≥1)。 ;性质3:对任意一棵二叉树T,若终端结点数为n0,而其度数为2的结点数为n2,则n0= n2+1 。;两种特殊的二叉树:;完全二叉树:;性质4:具有n个结点的完全二叉树的深度为?㏒2n?+1。 ;性质5:对于具有n个结点的完全二叉树,如果按照从上到下和从左到右的顺序对二叉树中的所有结点从1开始顺序编号,则对于任意的序号为i的结点有: ;6.2.3 二叉树的存储结构;1.顺序存储结构:是用一组连续的存储单元来存放二叉树的数据元素 。; 对于一般的二叉树,我们必须按照完全二叉树的形式来存储,就会造成空间的浪费。单支树就是一个极端情况。;2. 链式存储结构; ;证明:;6.3 二叉树的遍历与线索化;6.3 二叉树的遍历与线索化;用L、D、R分别表示遍历左子树、访问根结点、遍历右子树,那么对二叉树的遍历顺序就可以有:;在以上六种遍历方式中,如果我们规定按先左后右的顺序,那么就只剩有 DLR 、LDR 和LRD三种。根据对根的访问先后顺序不同,分别称DLR为先序遍历或先根遍历;LDR为中序遍历(对称遍历);LRD为后序遍历。 ;三种遍历方法的递归定义:;若二叉树为空,则空操作,否则依次执行如下操作: ①按中序遍历左子树; ②访问根结点; ③按中序遍历右子树。 ;(3)后序遍历(LRD)操作过程:;对于如下图的二叉树,其先序、中序、后序遍历的序列为: 先序遍历: A、B、D、F、G、C、E、H 。 中序遍历: B、F、D、G、A、C、E、H 。 后序遍历: F、G、D、B、H、E、C、A 。 ;以二叉链表作为存储结构,讨论二叉树的遍历算法;2) 中序遍历;3) 后序遍历;以中序遍历为例来说明中序遍历二叉树的递归过程;6.3.2 遍历算法应用;2.输出二叉树中的叶子结点;3.???计叶子结点数目;【算法思想】采用递归算法,如果是空树,返回0;如果只有一个结点,返回1;否则为左右子树的叶子结点数之和。 ;4.建立二叉链表方式存储的二叉树;5.求二叉树的高度;【算法思想】二叉树bt的高度可以递归定义如下: l? 若bt为空,则高度为0 l??若bt非空,其高度应为其左右子树高度的最大值加1 ;求二叉树的高度是也可用前序遍历的方式实现。 ;6. 按树状打印的二叉树;【算法思想】 (1)二叉树的横向显示应是二叉树竖向显示的90。旋转。分析图6.15图示可知,这种树形打印格式要求先打印右子树,再打印根,最后打印左子树,按由上而下顺序看,其输出的结点序列为:CFEADB,这恰为逆中序顺序。解决二叉树的横向显示问题采用“逆中序”遍历框架,所以横向显示二叉树算法为先右子树、再根结点、再左子树的RDL结构。 (2)在这种输出格式中,结点的左右位置与结点的层深有关,故算法中设置了一个表示当前根结点层深的参数,以控制输出结点的左右位置,每当递归进层时层深参数加1。这些操作应在访问根结点时实现。;6.3.3 基于栈的递归消除;void inorder(BiTree root); {int i=0; p=bt; L1: if (p!=NULL) /* 遍历左子树 */ {top=top+2; if(topm); s[top-1]=p; /* 本层参数进栈 */ s[top]=L2; /* 返回地址进栈 */ p=p-LChild; /* 给下层参数赋值 */ goto L1; /* 转向开始 */ L2: Visit(p-data); /* 访问根 */ top=top+2; if(topm); s[top-1]=p; /* 遍历右子树 */ ; s[top]=L3; p=p-RChild; goto L1; } L3: if(top!=0) { addr=s[top]; p=s[

文档评论(0)

1亿VIP精品文档

相关文档