一、二叉树的定义
1、定义
二叉树中,每个结点的度不大于2,并且,二叉树的子树有左右之分,其次序不能任意颠倒。注意:二叉树只限制了度,而没有对结点的元素之间的顺序进行限定,空二叉树指没有结点的二叉树(在计算机里,存在一个树结构类型的指针,但是该指针指向NULL),而不是有根节点但是根结点没有结点元素。
我们通常会对二叉树的结点按照从上到下、从左到右的顺序(层序)从1开始编号,这样就有了第i个结点的说法,但是需要注意的是:第i个结点并不意味着这个结点的元素是i,只是这个结点的序列是i,而这个结点的元素可以是任意数据。由于对二叉树度的限制,二叉树有了许多可以被量化探讨的性质,接下来将会介绍这些性质。
2、特殊的二叉树
(1)斜二叉树(Skewed Binary Tree)
所有结点均只有左子树或右子树的二叉树叫做斜二叉树,斜二叉树的高度太高,不利于查找等操作,这个时候和线性表差不多。
(2)完美二叉树(Perfect Binary Tree)/满二叉树(Full Binary Tree)
完美二叉树和满二叉树一样,只是译法不同,通常使用满二叉树的叫法,对于一颗满二叉树而言,每一层的结点都填满了该层,也就是说第k层的结点数为2k-1,满二叉树如下图所示,少一个结点,多一个结点都不是满二叉树了。
满二叉树平时用的也不是很多,用得更多的是接下来将要介绍的完全二叉树(Complete Binary Tree)。
(3)完全二叉树(Complete Binary Tree)
完全二叉树可以看作是满二叉树的退化版本,比如说,上图的满二叉树去掉G结点,就是一颗完全二叉树,如果只去掉F结点而不同时去掉G结点,这个时候就不是完全二叉树了。
关于完全二叉树的定义是这样的:有n个结点,这些结点按照从上到下、从左到右的顺序填充二叉树,最后得到的就是一颗完全二叉树。
完全二叉树更符合实际的情况,所以使用的很多。
二、二叉树的性质
性质1 在二叉树的第i层上至多有2k-1个结点 (k≥1)。
因为满二叉树每层的结点树实际上一个a1=1,公比为2的等比数列(a1对应第一层),所以这个很容易得出来。性质2 深度为k的二叉树至多有2k-1个结点 (k≥1)。
等比数列求和可知深度为k的满二叉树有2k-1个结点,这个是最多结点的情况,所以性质2成立。性质3 对任何一颗二叉树 T,如果其叶结点数为n0,度为2的结点数为n2,则有n0=n2+1。
证明:
设n1为该树中度为1的结点数,则树中边的总数en为
en = n0 + n1 + n2 - 1
考虑不同度对边的贡献有
en = 0*n0 + 1*n1 + 2*n2
所以有下式存在
0*n0 + 1*n1 + 2*n2 = n0 + n1 + n2 - 1
得到
n0 = n2+1
以上的3条性质对所有二叉树都成立,所以我在性质里将二叉树加粗了,接下来的性质就只针对于特定的二叉树成立,注意不要记混淆了。
- 性质4 具有n个结点的完全二叉树的深度为[log2n]+1。
这条性质是针对完全二叉树的,因为满二叉树实际上也是一种完全二叉树,所以这条性质对满二叉树也成立。注意这里不是[log2(n+1)]+1。
证明:
根据性质2,深度为k的完全二叉树的结点总数n不超过2k-1,所以有
2k-1-1 < n ≤ 2k-1或2k-1 < n ≤ 2k
所以有
k-1 < log2n ≤ k
k为整数,因此
k = [log2n]+1
- 性质5
如果对一颗有n个结点的完全二叉树的结点按层序编号,则对任一结点 i(1≤ i ≤ n),由
(1)如果 i = 1,那么结点 i 是二叉树的根,无双亲;如果 i > 1,则其双亲的序列号为[i/2]。
(2)如果 2i > n,则结点 i 没有左儿子 ,也没有右儿子(完全二叉树没有左儿子就一定没有右儿子);否则其左儿子的序列号为 2i。
(3)如果 2i+1 > n,则结点 i 没有右儿子;否则其右儿子的序列号为 2i+1。
性质5不展开证明,大家对照上面完全二叉树的图验证一下即可。
性质4和性质5会经常用到,一定要记牢。下一篇将介绍二叉树的实现及遍历。