- 1、本文档共129页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
算法与数据结构[c语言]第5章二叉树与树
第五章 二 叉 树与树;5.1 二叉树及其抽象数据类型 ;5.1.1基本概念;;二叉树相关的一组术语 :
父结点、左(右)子结点、边
兄弟
祖先、子孙
路径、路径长度
结点的层数
结点的度数
二叉树的高度 :二叉树中结点的最大层数称为二叉树的高度。 例如,二叉树t的高度为3。
树叶、分支结点 ;;;扩充的二叉树:把原二叉树的结点都变为度数为2的分支结点,也就是说,如果原结点的度数为2,则不变,度数为1,则增加一个分支,度数为0(树叶),则增加两个分支。
新增加的结点(树叶结点)都用小方框表示,称为外部结点,树中原有的结点称为内部结点。把空二叉树扩充得到的扩充二叉树规定为只有一个外部结点组成的二叉树。; ;;5.1.2 主要性质;?;?;性质5 对于具有n个结点的完全二叉树,如果按照从上(根结点)到下(叶结点)和从左到右的顺序对二叉树中的所有结点从0开始到n-1进行编号,则对于任意的下标为i的结点,有:(1) 如果i=0,则它是根结点,它没有父结点:如果i>0,则它的父结点的下标为[(i-1)/2];(2) 如果2i+1≤n-1,则下标为i的结点的左子结点的下标为2i+1;否则,下标为i的结点没有左子结点:(3) 如果2i+2≤n-1,则下标为i的结点的右子结点的下标为2i+2;否则,下标为i的结点没有右子结点。 ;;;5.1.3 二叉树的抽象数据类型;BinTreeNode root ( BinTree t )
返回二叉树t的根结点。若为空二叉树,则返回一特殊值。
BinTreeNode parent (BinTree t , BinTreeNode p )
返回结点p的父结点。当指定的结点为根时,返回一个特殊值。
BinTree leftChild ( BinTree t , BinTreeNode p )
返回p结点的左子树,当指定结点没有左子树时,返回一个特殊值。
BinTree rightChild ( BinTree t , BinTreeNode p)
返回p结点的右子树,当指定结点没有右子树时,返回一个特殊值。
end ADT BinTree
由于二叉树的概念是递归定义的,二叉树中的每个结点也可标识以这个结点为根的二叉树,所以二叉树类型和二叉树中结点类型在具体实现时常常看成是同一种类型。
在关于二叉树的周游等算法中,采用这种观点描述特别方便。
;5.2 二叉树的周游;5.2.2 周游的分类;先根次序:;后根次序;对称(中根)次序 ;;;;5.2.4 周游的抽象算法?;递归算法;非递归算法;;;;从上面的分析中可以看出,在后根次序周游二叉树时,一个二叉树可能要进、出栈各两次,只有在它第二次出栈之后,才可以访问该二叉树的根结点。为了区分同一二叉树的两次出栈,需要给栈中二叉树增加一标志量tag,定义为:若tag=1,则本二叉树是第一次进栈,所有下次出栈,不能访问本二叉树的根结点;若tag=2,则本二叉树是第二次进栈,所有下次出栈,应该访问本二叉树的根结点。
; 二叉树进、出栈时,其标志量tag也同时进、出栈,因此,可以把二者合并成一个结构变量,将栈中元素的数据类型设置为下面的形式:
typedef struct {
int tag; /* 标记 */
BinTree t; /* 二叉树 */
} Elem;
程序实现:void nPostOrder1(BinTree t)
这里虽然是一个两重循环,但是每个子树进栈和出栈两次,所以时间代价仍然是O(n)。
;以上算法可以从两个方面加以改进:一方面是取消标志tag,以节省栈的空间;另一方面是每个二叉树只进栈和出栈一次,以节省执行时间。为此必须在算法中二叉树出栈时增加判断;如果是从栈顶二叉树的左子树回来,就直接进入右子树周游,如果是从栈顶二叉树的右子树回来,就执行出栈,访问该二叉树的根结点。
程序实现:void nPostOrder2(BinTree t) ;;每个二叉树进队列一次出队列一次,所以时间代价为O(n)。主要空间代价是需要队列的附加空间。若二叉树结点个数为n,最坏的情况出现在完全二叉树时,需要大约n/2个队列元素的空间。 ;5.3 二叉树的实现 ;5.3.1 顺序表示;完全二叉树及其顺序表示;对于一般的二叉树,如果仍采用顺序表示,首先要对它进行扩充,增加一些并不存在的空结点,使之成为一棵完全二叉树,然后再用一维数组顺序存储。在二叉树中人为增加的空结点,在数组所对应的元素中,可以用一个特殊值表示。 ;;;运算的实现 ;5.3.2 链接表
文档评论(0)