- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第六章 树和二叉树;树在数据结构中的位置;一、定义:
树(Tree)是n(n=0)个结点的有限集T,T为空时称为空树,否则它满足如下两个条件:
(1)有且仅有一个特定的称为根(Root)的结点;
(2)其余的结点可分为m(m=0)个互不相交的子集T1,T2,T3…Tm,其中每个子集又是一棵树,并称其为子树(Subtree)。;A;二、树的例子;三、基本术语;;1、树形表示法
2、集合图表示
3、广义表表示
4、凹入表表示;对比树型结构和线性结构的结构特点;6.2 二叉树;6.2.2 二叉树的性质
性质1: 在二叉树的第i层上至多有2i-1个结点(i=1)。
采用归纳法证明此性质。
(1)当i=1时,2i-1=20 =1,命题成立。
(2)假定i=k时命题成立,即第k层最多有2k-1个结点;
(3)由归纳假设可知,由于二叉树每个结点的度最大为2,故在第k+1层上最大结点数为第k层上最大结点数的2倍,
即2×2k-1=2k=2(k+1)-1
命题得到证明。; 性质2 :深度为 k 的二叉树至多有 2k-1个结点(k≥1)。
证明:由性质1可见,深度为k的二叉树的最大结点数为
;性质3: 对任何一棵二叉树,如果其终端结点数为
n0,度为2的结点数为n2,则n0=n2+1。
证明:设二叉树上结点总数 n = n0 + n1 + n2 (1)
又二叉树上分支总数 b = n1+2n2 (2)
而除根结点外,其余结点都有分支进入,即
b = n-1
将(1)(2)式代入,得 n0 = n2 + 1 。
;两类特殊的二叉树:满二叉树和完全二叉树;
性质4:具有n个结点的完全二叉树的深度为[log2n]+1。
证明:假设此二叉树的深度为k,则根据性质2及完全二叉树的定义得到:
2k-1-1n=2k-1 或 2k-1=n2k
取对数得到:k-1=log2nk 因为k是整数。
所以有:k=【log2n】+1。;性质5: 如果对一棵有n个结点的完全二叉树的结点按层序编号(从第1层到第【log2n】+1层,每层从左到右),则对任一结点i(1=i=n),有:
(1)如果i=1,则结点i无双亲,是二叉树的根;如果i1,则其双亲是结点【i/2】。
(2)如果2in,则结点i为叶子结点,无左孩子;否则,其左孩子是结点2i。
(3)如果2i+1n,则结点i无右孩子;否则,其右孩子是结点2i+1。; ;树和二叉树的ADT定义;6.2.3 二叉树的存储结构
(1)顺序存储结构
完全二叉树:用一组连续的存储单元依次自上而下、自左至右存储各结点元素。即将完全二叉树上编号为i 的结点的值存储在下标为 i-1 的数组元素中。结点间的关系可由公式计算得到。
一般情形的二叉树:增添一些空结点使变成完全二叉树形态,再按上述方法存储。;A;单支二叉树;;二叉树的二叉链表存储表示;二叉树链表表示的示例:;6.3 遍历二叉树和线索二叉树;6.3.1 二叉树的遍历;先序遍历;? void preorder (BiTNode *root) {
if (root!=NULL) {
cout root-data;//访问根结点
preorder(root-Lchild); //先序遍历根的左子树
preorder(root-Rchild); //先序遍历根的右子树
}//if
}//preorder
;? void preorder (BiTNode *root) {
if (root!=NULL) {
cout root-data;//访问根结点
preorder(root-Lchild); //先序遍历根的左子树
preorder(root-Rchild); //先序遍历根的右子树
}//if
}//preorder
;? void preorder (BiTNode *root) {
if (root!=NULL) {
cout root-data;//访问根结点
preorder(root-Lchild); //先序遍历根的左子树
preorder(root-Rchil
文档评论(0)