Tree(2)--二叉树(Binary Tree)

来源:互联网 发布:网络系统管理课程 编辑:程序博客网 时间:2024/05/16 06:19

1.二叉树的定义

二叉树(Binary Tree):一棵二叉树的结点是一个有限集合。该集合或者为空,或者是由一棵根结点加上两棵分别称为左子树和右子树的、互不相交的二叉树组成。二叉树的子树仍然是二叉树,达到空子树时递归的定义结束。
这里写图片描述
二叉树中不存在树大于2的结点,且左右子树的次序不能颠倒。以下是二叉树的五种不同形态:
这里写图片描述

满二叉树(Full Binary Tree)
定义:高度为h,并且由2h1个结点的二叉树,被称为满二叉树。每一层的结点都达到了最大值
这里写图片描述

完全二叉树(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层上的结点数目最多为2i1 (i1)。
证明:下面用数学归纳法进行证明。
当i=1时,第i层的节点数目为2i1=20=1。因为第1层上只有一个根结点,所以命题成立。
假设当i>1,第i层的节点数目为2i1。下面根据这个假设,推断出第(i+1)层的节点数目为2i即可。
由于二叉树的每个结点至多有两个孩子,故第(i+1)层上的结点数目最多是第i层的结点数目的2倍。即第(i+1)层上的结点数目最大值=2×2i1=2i
故假设成立,原命题得证!

性质2:深度为k的二叉树至少有k个结点,至多有2k1个结点(k≥0)。
证明:在具有相同深度的二叉树中,当每一层都含有最大结点数时,其树中结点数最多。利用”性质1”可知,深度为k的二叉树的结点数至多为:
20+21++2k1=2k1
故原命题得证!

性质3:包含n个结点的二叉树的高度至少为log2(n+1)
证明:根据性质2可知,高度为h的二叉树最多有2h1个结点。反之,对于包含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的完全二叉树至多结点个数n2k1 最少结点个数n>2k11,因此
2k11<n2k1
2k1<n+12k
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) 若 2in,则结点i的左孩子结点为2i。
(5) 若 2i+1n,则结点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

原创粉丝点击