树的定义--二叉树+二叉树的性质+二叉树的存储

树与二叉树
我们生活中大树的感觉,往往给人感觉是靠谱的、靠得住。而一颗树想要给人带来这种感觉,不是一朝一夕就能形成的,都是从一个小树根,通过不停的开支散叶,才慢慢变成一个参天大树。
2010《阿凡达》:创造电影界的很多记录,电影里面的参天大树,就是生活依靠。

树的作用和意义:
企业的组织架构、决策的过程、族谱图、二叉树可以用来表示算术表达式(赫夫曼编码)。

一、数据结构中树的定义:
描述:一颗树根上长树枝,树枝上面又有根去长树枝,简单的就是一种一对多的关系。
定义:树(Tree)是n(n>=0)个节点的有限集,n=0时称为“空树”。在任意一棵非空树中:
⒈有且仅有一个特定的称为根(root)的节点。
⒉当n>1时,其余节点可分为m(m>0)个互不相交的有限集T1、T2……Tm,其中每一个集合本身又是一棵树,并且称之为根的子树(SubTree)。

注意:
⒈n>0时根节点是唯一的,不可能存在多个根节点。
⒉m>0时,子树个数没有限制,但一定互不相交。
3、每个树产生的方式,是一种递归的方式。(定义中树使用了树本身的结构)
===============================================================================
无论什么结构,在数据结构中大多数情况都是研究数据元素之间的关系,而数据元素是以节点的形式体现的,实际就是研究节点的关系

树的节点的相关基本概念:
根节点和子树(节点的分类):
所有节点的前驱就是根节点
从根节点出发拆分成若干个互不相交的子集合(有限集合),这些子集和相对于根节点就是子树。

度和叶子节点(节点的分类):
度:节点拥有的子树个数称为节点的度(一个树的度数,就是该树中节点的最大度数)
叶子节点:度为零的节点就是叶子节点
度不为0且不为根节点的节点称为“内部节点”

父节点和子节点(节点间的关系):
子节点:一个根节点的子树的根节点称为该节点的子节点
父节点:该节点称为子节点的父节点
同一个双亲的孩子之间成为兄弟节点
其他的关系节点(类似我们生活所说的族谱)

层次和高端/深度(节点的层次层次):
层次:从根节点开始是第一层,依次递推,就是节点的层次。
高度/深度:就是当前这颗树最大的层次就是该树的高度/深度。

树的其他相关概念:
有序树和无序树(树的序列关系):
有序树:该树中节点的子树看成是从左到右有次序的,不能互换的,则称该树为有序树
无序树:该树中节点的子树看成是从左到右无次序的,可以互换,则称该树为无序树
(对比两幅图,好比生活中你从两个对立方向去看一个树,主观的判断每个子集合是否可以任意更换顺序)

所有的关系都是成对出现的,有对比的记忆就非常方便。
===============================================================================
===============================================================================

二、二叉树
1、定义:二叉树(Binary Tree)是n(n>=0)个节点的有限集合,该集合或者为空集(称为“空二叉树”),或者由一个根节点和两棵互不相交的、分别称为根节点的左子树和右子树的二叉树组成。(简单的理解就是一个根节点最多有两个子节点的树形结构就是二叉树)

为什么研究二叉树???
任意一棵树或者森林都可以完全等价于二叉树来实现(数据结构中)。

2、二叉树的特点:
⒈每个节点最多有两棵子树,所以二叉树中不存在度大于2的节点。注意不是“只有”,而是“最多有”,即可以没有子树或只有一棵子树。
⒉左子树和右子树有序,不能随意颠倒。(有序树)
⒊即使树中某节点只有一棵子树,也要区分它是左子树还是右子树,不能混淆。

3、二叉树的基本形态:
二叉树具有五种基本形态
⒈空二叉树
⒉只有一个根节点
⒊根节点只有左子树(左斜树)
⒋根节点只有右子树(右斜树)
⒌根节点既有左子树又有右子树

4、满二叉树:
在一棵二叉树中,如果所有分支节点都存在左子树和右子树,并且所有叶子节点都在同一层上,这样的二叉树称为满二叉树。
满二叉树的特点有:
⒈叶子节点只能出现在最下面一层。出现在其他层就不可能达到平衡。
⒉非叶子节点的度一定是2。
⒊在同样深度的二叉树中,满二叉树的节点个数最多,叶子节点个数最多。

5、完全二叉树:(与满二叉树想对应的,相当于线性结构里面的栈,栈有很多的特性)
对一棵具有n个节点的二叉树按层序编号,如果编号为i(1<=i<=n)的节点与同样深度的满二叉树中编号为i的节点在二叉树中的位置完全相同,则这棵二叉树称为完全二叉树。
需要注意区分满二叉树与完全二叉树,满二叉树一定是一棵完全二叉树,而完全二叉树不一定是满的。
判定一棵二叉树是否是完全二叉树需要对该二叉树进行层序编号。
层序编号:以根节点作为起点,从左至右对每一层的节点进行编号。对该层的所有节点编号完毕后再对下一层的节点进行编号。
从这里我们也可以得到一些完全二叉树的特点:
⒈叶子节点只能出现在最下两层
⒉最下层的叶子节点一定集中在左部的连续位置
⒊倒数二层,若有叶子节点,一定都在右部连续位置
⒋如果节点度为1,则该节点只有左孩子,不存在只有右子树的情况
⒌同样节点数的二叉树,完全二叉树的深度最小
注意:同样节点数的二叉树,深度最小的二叉树不一定是完全二叉树

三、二叉树的性质
关于二叉树,有一些需要理解并记忆的特性,以便我们更好使用它
1、性质1:在二叉树的第i层上至多有2^(i-1)个节点(i>=1)。(至多的情况就是满二叉树)

2、性质2:深度为k的二叉树至多有2^k-1个节点(k>=1)。注意不是2^(k-1)。
等比数列:
1=2^1-1;
1+2 = 3 = 2^2-1;
1+2+4 = 7 = 2^3-1;
1+2+4+8 = 15 = 2^4-1;
...

3、性质3:对于任何一棵二叉树T,如果其叶子节点数为n0,度为2的节点数为n2,则n0=n2+1。
性质3的推导:
二叉树的节点的度只有3种:0、1、2。我们设其对应的节点数分别为n0、n1、n2,则二叉树的节点总数为:
Tn=n0+n1+n2
二叉树的连线数应等于节点个数减1,即
Sn=Tn-1(所有的节点都有一个前驱,根节点没有前驱)
Sn = n0 + n1 + n2 - 1 = n1 + 2n2
另一方面(度为1的节点有1根连接线,度为2的节点有2根连接线),二叉树的连线数应等于2*n2+n1,即Sn=2*n2+n1
我们可得到:
n0+n1+n2-1=2*n2+n1
整理可得
n0=n2+1
若事先已知叶子节点个数,使用性质3可以快速计算出一个二叉树的度为2的节点个数,进而推出度为1的节点个数。

应用:
例:假设一个完全二叉树的总节点个数为699个,则叶子节点有几个?
答:350个。(没有n1)
n0+n1+n2 = 699
n1是0或者1
n0+(1/0)+(n0-1) = 699; 2n0 + (1/0)= 700;
2n0 + (1/0) = 700 ;
n0 = 350;

4、性质4:如果对一颗有n个结点的完全二叉树的结点按层序编号,对任一结点i有:
1、如果i=1,则结点i是二叉树的根节点,无父节点;如果i>1,则有父节点是结点i/2;
2、如果2*i>n,则结点i没有左子节点;否则其左子节点是结点2*i
3、如果2*i+1>n, 则结点i没有右子节点,否则其右子节点是结点2*i+1

===============================================================================
===============================================================================

四、二叉树的存储
二叉树在内存中是无法形象存储的,通常情况下我们可以使用顺序存储和链式存储两种结构来模拟双亲与孩子的逻辑关系从而存储二叉树。
1、顺序存储结构
顺序存储结构就是利用一维数组存储二叉树中的节点。将一个完全二叉树按层序编号的方式,可以得到节点编号与该节点的数据的一一对应关系,这样我们就可以使用数组来存储该完全二叉树了。
对于非完全二叉树,我们需要先将其补全为完全二叉树,再进行存储。后补的节点存储时数据为空(NULL)。考虑到一种极端情况,若有一棵深度为k的右斜树,只有k个节点,但根据存储方式我们需要建立一个2^k-1个存储单元。因此顺序存储一般不常用,仅用于存储完全二叉树。
===============================================================================
2、链式存储结构
既然顺序存储适用性不强,我们就要考虑链式存储结构。二叉树每个节点最多有两个孩子,所以为它涉及一个数据域和两个指针域。
lchild︱data︱rchild
其中data是数据域,lchild和rchild都是指针域,分别存放指向左孩子和右孩子的指针。

typedef struct BiTNode
{
data_t data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值