1.二叉树的定义
二叉树(Binary Tree):一棵二叉树的结点是一个有限集合。该集合或者为空,或者是由一棵根结点加上两棵分别称为左子树和右子树的、互不相交的二叉树组成。二叉树的子树仍然是二叉树,达到空子树时递归的定义结束。
二叉树中不存在树大于2的结点,且左右子树的次序不能颠倒。以下是二叉树的五种不同形态:
满二叉树(Full Binary Tree)
定义:高度为h,并且由
2h–1
个结点的二叉树,被称为满二叉树。每一层的结点都达到了最大值
完全二叉树(Complete Binary Tree)
定义1:一棵二叉树中,只有最下面两层结点的度可以小于2,并且最下一层的叶结点集中在靠左的若干位置上。这样的二叉树称为完全二叉树。
定义2:具有n个结点的深度为k的二叉树,它的每一个结点都与高度为k的满二叉树中编号为1-n的结点一一对应。
特点:叶子结点只能出现在最下层和次下层,且最下层的叶子结点集中在树的左部。显然,一棵满二叉树必定是一棵完全二叉树,而完全二叉树未必是满二叉树。
二叉搜索树(Binary Search Tree)
定义:二叉查找树(Binary Search Tree),又被称为二叉搜索树。设x为二叉查找树中的一个结点,x节点包含关键字key,节点x的key值记为key[x]。如果y是x的左子树中的一个结点,则key[y] <= key[x];如果y是x的右子树的一个结点,则key[y] >= key[x]。
在二叉查找树中:
∙
若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
∙
任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
∙
任意节点的左、右子树也分别为二叉查找树。
∙
没有键值相等的节点(no duplicate nodes)。
2.二叉树的性质
性质1:二叉树第i层上的结点数目最多为
2i−1
(
i≥1
)。
证明:下面用数学归纳法进行证明。
∙
当i=1时,第i层的节点数目为
2i−1=20=1
。因为第1层上只有一个根结点,所以命题成立。
∙
假设当i>1,第i层的节点数目为
2i−1
。下面根据这个假设,推断出第(i+1)层的节点数目为
2i
即可。
由于二叉树的每个结点至多有两个孩子,故第(i+1)层上的结点数目最多是第i层的结点数目的2倍。即第(i+1)层上的结点数目最大值=
2×2i−1=2i
。
故假设成立,原命题得证!
性质2:深度为k的二叉树至少有k个结点,至多有
2k−1
个结点(k≥0)。
证明:在具有相同深度的二叉树中,当每一层都含有最大结点数时,其树中结点数最多。利用”性质1”可知,深度为k的二叉树的结点数至多为:
20+21+…+2k−1=2k−1
故原命题得证!
性质3:包含n个结点的二叉树的高度至少为
log2(n+1)
。
证明:根据性质2可知,高度为h的二叉树最多有
2h–1
个结点。反之,对于包含n个节点的二叉树的高度至少为
log2(n+1)
。
性质4:在任意一棵二叉树中,若终端结点(叶子结点)的个数为
n0
,度为2的结点数为
n2
,则
n0
=
n2
+1。
证明:因为二叉树中所有结点的度数均不大于2,所以结点总数(记为n)=”0度结点数(
n0
)” + “1度结点数(
n1
)” + “2度结点数(
n2
)”。由此,得到
n=n0+n1+n2
(式1)
另一方面,0度结点没有孩子,1度结点有一个孩子,2度结点有两个孩子,故二叉树中孩子结点总是:
n1+2n2
。此外,只有根不是任何结点的孩子。故二叉树中的结点总数又可表示为
n=n1+2n2+1
(式2)。由(式1)和(式2)计算得到:
n0
=
n2
+1。原命题得证!
性质5:具有n个结点的完全二叉树的深度为[
log2(n+1)
]。
证明:因为性质2:深度为k的完全二叉树至多结点个数
n≤2k−1
最少结点个数
n>2k−1−1
,因此
2k−1−1<n≤2k−1
2k−1<n+1≤2k
k<log2(n+1)≤k
因为
log2(n+1)
介于k-1和k之间,深度又只能是整数,故深度为[
log2(n+1)
]
(此性质也适用于理想平衡二叉树)
性质6:若对含 n 个结点的完全二叉树从上到下且从左至右进行 1 至 n 的编号,则对完全二叉树中任意一个编号为 i 的结点:
(1) 若 i=1,则该结点是二叉树的根,无双亲, 否则,编号为 [i/2] 的结点为其双亲结点;
(2) 若 2i>n,则该结点无左孩子, 否则,编号为 2i 的结点为其左孩子结点;
(3) 若 2i+1>n,则该结点无右孩子结点, 否则,编号为2i+1 的结点为其右孩子结点。
(4) 若 2i
≤
n,则结点i的左孩子结点为2i。
(5) 若 2i+1
≤
n,则结点i的右孩子结点为2i+1。
(6) 若 i为奇数,且i不为1,它处于右兄弟位置,则它的左兄弟结点为i-1。
(7) 若 i为偶数,且i不为n,它处于左兄弟位置,则它的右兄弟结点为i+1。
(8) 结点i所在的层次为为[
log2i
]+1。
3. ADT of Binary tree
template <class Type> class BinaryTree {
public:
BinaryTree ( );
BinaryTree ( BinTreeNode<Type> * lch, BinTreeNode<Type> * rch, Type item );
int IsEmpty ( );
BinTreeNode<Type> *Parent (BinTreeNode<Type>* c );
BinTreeNode<Type> *LeftChild (BinTreeNode<Type>* c );
BinTreeNode<Type> *RightChild (BinTreeNode<Type>* c );
int Insert ( const Type &item );
int Find ( const Type &item ) const;
Type GetData ( ) const;
const BinTreeNode<Type> *GetRoot ( ) const;
}
4. Implementation of Binary Tree
1.二叉树的数组存储表示
这种存储方式是存储完全二叉树最简单、最省存储的方式,但是对于一般的二叉树造成空间浪费。
2.二叉树的链表存储表示
可以用二叉链表或者三叉链表来存储。一般采用三叉链表。
下图表示的是三叉链表。三叉链表的每个结点包含四个域:存放数据、指向左右孩子的指针和指向父结点的指针。整个二叉树有一个表头指针,指向根节点。
References:
[1] http://www.cnblogs.com/willwu/p/6007555.html