6.2二叉树的定义

6.2二叉树

一、二叉树的定义与基本操作

定义:把满足以下两个条件的树型结构叫做二叉树(Binary Tree):
(1) 每个结点的度都不大于 2;
(2) 每个结点的孩子结点次序不能任意颠倒。

由此定义可看出,一个二叉树中的每个结点只能含有 0、1 或 2 个孩子,而且每个孩子有左右之分。位于左边的孩子叫做左孩子,位于右边的孩子叫做右孩子。

下给出了二叉树的五种基本形态:
图(a)所示为一棵空的二叉树;
图(b)所示为一棵只有根结点的二叉树;
图(c)所示为一 棵只有左子树的二叉树(左子树仍是一棵二叉树);
图(d)所示为左、右子树均非空的二叉 树(左、右子树均为二叉树);
图(e)所示为一棵只有右子树的二叉树(右子树也是一棵二叉树)。二叉树也是树,故前面所介绍的有关树的术语都适用于二叉树。
在这里插入图片描述
与树的基本操作类似,二叉树有如下基本操作:

  • ⑴ Initiate(bt):将 bt 初始化为空二叉树。
  • ⑵ Create(bt):创建一棵非空二叉树 bt。
  • ⑶ Destory(bt): 销毁二叉树 bt。
  • ⑷ Empty(bt): 若 bt 为空,则返回 TRUE,否则返回 FALSE。
  • ⑸ Root(bt): 求二叉树 bt 的根结点。若 bt 为空二叉树,则函数返回“空”
  • ⑹ Parent(bt,x):求双亲函数。求二叉树 bt 中结点 x 的双亲结点。若结点 x 是二叉 树的根结点或二叉树 bt 中无结点 x,则返回“空” 。
  • ⑺ LeftChild(bt,x):求左孩子。返回结点 x 的左孩子,若结点 x 无左孩子或 x 不在 bt 中,则返回“空”。
  • ⑻ RightChild(bt,x):求右孩子。返回结点 x 的右孩子,若结点 x 无右孩子或 x 不 在 bt 中,则返回“空” 。
  • ⑼ Traverse(bt): 遍历操作。按某个次序依次访问二叉树中每个结点一次且仅一次。
  • ⑽ Clear(bt):清除操作。将二叉树 bt 置为空树。

二、二叉树的性质

  • 性质 1:在二叉树的第 i 层上至多有 2i-1个结点(i≥1)。
    证明:用数学归纳法。
    归纳基础
    当 i=1 时,整个二叉树只有一个根结点,此时 2i-1=20=1,结论成立。
    归纳假设
    假设 i=k 时结论成立,即第 k 层上结点总数最多为 2k-1个。 欲证明当 i=k+1 时,结论成立。 因为二叉树中每个结点的度最大为 2,则第 k+1 层的结点总数最多为第 k 层上结点最大 数的 2 倍,即 2×2k-1=2(k+1)-1,故结论成立。

  • 性质 2:深度为 k 的二叉树至多有 2k-1 个结点(k≥1)
    证明:因为深度为 k 的二叉树,其结点总数的最大值是将二叉树每层上结点的最大值相加, 所以深度为 k 的二叉树的结点总数至多为:
    在这里插入图片描述
    故结论成立。

  • 性质 3:对任意一棵二叉树 T,若终端结点数为 n0,而其度数为 2 的结点数为 n2,则 n0= n2+1 证明:设二叉树中结点总数为 n,n1为二叉树中度为 1 的结点总数。
    因为二叉树中所有结点的度小于等于 2,所以有 n= n0+ n1+n2
    设二叉树中分支数目为 B,因为除根结点外,每个结点均对应一个进入它的分支,所以有 n=B+1
    又因为二叉树中的分支都是由度为 1 和度为 2 的结点发出,所以分支数目为 B=n1+2n2
    整理上述两式,可得到 n=B+1=n1+2n2+1
    将 n= n0+ n1+n2代入上式,得出 n0+ n1+n2=n1+2n2+1,整理后得 n0= n2+1,故结论成立。

下面先给出两种特殊的二叉树,然后讨论其有关性质。

  • 满二叉树:深度为 k 且有 2k-1 个结点的二叉树。在满二叉树中,每层结点都是满的, 即每层结点都具有最大结点数。如下图(a)所示的二叉树即为一棵满二叉树。

  • 满二叉树的顺序表示,即从二叉树的根开始,层间从上到下,层内从左到右,逐层进行 编号(1,2,··· ,n)。例如下图(a)所示的满二叉树的顺序表示为(1,2,3,4,5,6,7,8, 9,10,11,12,13,14,15)。

  • 完全二叉树:深度为 k,结点数为 n 的二叉树,如果其结点 1~n 的位置序号分别与满 二叉树的结点 1~n 的位置序号一一对应,则为完全二叉树,如下图(b)所示。 可见,满二叉树必为完全二叉树,而完全二叉树不一定是满二叉树。
    在这里插入图片描述

  • 性质 4:具有 n 个结点的完全二叉树的深度为[log2n] +1。
    证明:假设 n 个结点的完全二叉树的深度为 k,根据性质 2 可知,k-1 层满二叉树的结点总数为:n1=2k-1-1 (2的k-1次方)
    k 层满二叉树的结点总数为: n2=2k-1 (2的k次方)
    显然有 n1<n≤n2,进一步可以推出 n1+1≤n<n2+1
    将 n1=2k-1-1 和 n2=2k-1 代入上式,可得 2k-1≤n<2k,
    即 k-1≤log2n<k。
    因为 k 是整数,所以 k-1=[log2n],k=[[log2n]+1, 故结论成立。

  • 性质 5: 对于具有 n 个结点的完全二叉树,如果按照从上到下和从左到右的顺序对二叉树中的所有结点从 1 开始顺序编号,则对于任意的序号为 i 的结点有:
    (1)如 i=1,则序号为 i 的结点是根结点,无双亲结点;如 i>1,则序号为 i 的结点的 双亲结点序号为  2/i 。
    (2)如 2×i>n,则序号为 i 的结点无左孩子;如 2×i≤n,则序号为 i 的结点的左孩 子结点的序号为 2×i。 (3)如 2×i+1>n,则序号为 i 的结点无右孩子;如 2×i+1≤n,则序号为 i 的结点 的右孩子结点的序号为 2×i+1。

可以用归纳法证明其中的(2)和(3):
当 i=1 时,由完全二叉树的定义知,如果 2×i=2≤n,说明二叉树中存在两个或两个以 上的结点,所以其左孩子存在且序号为 2;反之,如果 2>n,说明二叉树中不存在序号为 2 的结点,其左孩子不存在。同理,若2×i+1=3≤n,说明其右孩子存在且序号为 3;如果 3>n,则二叉树中不存在序号为 3 的结点,其右孩子不存在。

假设对于序号为 j(1≤j≤i)的结点,当 2×j≤n 时,其左孩子存在且序号为 2×j,当 2×j>n 时,其左孩子不存在;当 2×j+1≤n 时,其右孩子存在且序号为 2×j+1,当 2×j+1>n 时,其右孩子不存在。

当 i=j+1 时,根据完全二叉树的定义,若其左孩子存在,则其左孩子结点的序号一定等 于序号为 j 的结点的右孩子的序号加 1,即其左孩子结点的序号等于 (2×j+1)+1=2 (j+1) =2×i,且有 2×i≤n;如果 2×i>n,则左孩子不存在。若右孩子结点存在,则其右孩子结 点的序号应等于其左孩子结点的序号加 1,即右孩子结点的序号为=2×i+1,且有 2×i+1≤n; 如果 2×i+1>n,则右孩子不存在。
故(2)和(3)得证。

由(2)和(3)我们可以很容易证明(1)
当 i=1 时,显然该结点为根结点,无双亲结点。当 i>1 时,设序号为 i 的结点的双亲结 点的序号为 m,如果序号为 i 的结点是其双亲结点的左孩子,根据(2)有 i=2×m,即 m=i/2; 如果序号为 i 的结点是其双亲结点的右孩子,根据(3)有 i=2×m+1,即 m= (i-1)/2=i/2-1/2, 综合这两种情况可以得到,当 i>1 时,其双亲结点的序号等于[2/i ]。

三、二叉树的存储结构

顺序存储

对于完全二叉树来说,可以将其数据元素逐层存放到一组连续的存储单元中,如下图所示。 用一维数组作存储结构,将二叉树中编号为 i 的结点存放在数组的第 i 个分量中。根据二叉 树的性质 5,可得结点 i 的左孩子的位置为 LChild(i)=2×i;右孩子的位置为 RChild(i) =2 ×i+1。
在这里插入图片描述

显然,这种存储方式对于一棵完全二叉树来说是非常方便的。因为对完全二叉树采用顺序存 储结构既不浪费空间,又可以根据公式计算出每一个结点的左、右孩子的位置。但是,对于 一般的二叉树,我们必须用“虚结点”将其补成一棵“完全二叉树”来存储,这就会造成空 间浪费。一种极端的情况如下图所示,从中可以看出,对于一个深度为 k 的二叉树,在最坏的情况下(每个结点只有右孩子)需要占用 2k-1 个存储单元,而实际该二叉树只有 k 个结 点,空间的浪费太大,这是顺序存储结构的一大缺点。
在这里插入图片描述

链式存储

对于任意的二叉树来说,每个结点只有两个孩子,一个双亲结点。可以设计每个结点至少包 括三个域:数据域、左孩子域和右孩子域,如下图所示。
在这里插入图片描述
其中,LChild 域指向该结点的左孩子,Data 域记录该结点的信息,RChild 域指向该结点的 右孩子。此结点结构形成的二叉树称为二叉链表,如下图所示
在这里插入图片描述
用 C 语言定义二叉树的二叉链表结点结构如下:

typedef struct Node 
{ 
	DataType data; 
	struct Node * LChild; 
	struct Node * RChild; 
}BiTNode, *BiTree;`

若一个二叉树含有 n 个结点,则它的二叉链表中必含有 2n 个指针域,其中必有 n+1 个空的链域。
证明:分支数目 B=n-1,即非空的链域有 n-1 个,故空链域有 2n-(n-1)=n+1 个。

有时,为了便于找到双亲结点,可以增加一个 Parent 域,以指向该结点的双亲结点。 采用这种结点结构的存放方式称做二叉树的三叉链表存储结构。 不同的存储结构实现二叉树的操作也不同。如要找某个结点的父结点,在三叉链表中很 容易实现;在二叉链表中则需从根指针出发一一查找。可见,在具体应用中,要根据二叉树的形态和要进行的操作来决定采用哪种二叉树的存储结构。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值