二叉树的定义
二叉树是另一种树形结构,其特点就是每个结点至多有两棵子树(即二叉树中不存在度大于等于2的结点),且二叉树的子树有左右之分,其次序是不能颠倒。所以二叉树也是以递归的形式定义。二叉树是 n (n>=0)个结点的集合;
【注】n=0时为空二叉树;
一些基本概念:
树的结点(node):包含一个数据元素及若干指向子树的分支;
孩子结点(child node):结点的子树的根称为该结点的孩子;
双亲结点:B 结点是A 结点的孩子,则A结点是B 结点的双亲;
结点层:根结点的层定义为1;根的孩子为第二层结点,依此类推;
树的深度:树中最大的结点层;
结点的度:结点子树的个数;
树的度: 树中最大的结点度;
叶子结点:也叫终端结点,是度为 0 的结点;
分枝结点:度不为0的结点;
有序树:子树有序的树;
无序树:不考虑子树的顺序;
二叉树五种基本形态:
几个特殊的二叉树:
1.完全二叉树
若设二叉树的高度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第h层有叶子结点,并且叶子结点都是从左到右依次排布,这就是完全二叉树。
2.满二叉树
除了叶结点外每一个结点都有左右子叶且叶子结点都处在最底层的二叉树。
3.平衡二叉树
它是一棵二叉排序树,且具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
二叉树的性质
(1) 在非空二叉树中,第 i 层的结点总数不超过 2 i − 1 2^{i-1} 2i−1 ,(i >= 1);
(2) 深度为h的二叉树最多有 2 h − 1 2^h-1 2h−1个结点(h >= 1),最少有h个结点;
(3) 对于任意一棵二叉树,如果其叶结点数为 n 0 n_0 n0,而度数为2的结点总数为 n 2 n_2 n2,则 n 0 n_0 n0= n 2 n_2 n2+1;
(4) 具有 n 个结点的完全二叉树的深度为 [ log 2 n + 1 \log_2{n+1} log2n+1] (注:[ ]表示向下取整);
(5)有 n 个结点的完全二叉树各结点如果用顺序方式存储,则结点之间有如下关系:
若 i 为结点编号则 如果 i >1,则其父结点的编号为
i
2
i\over 2
2i;
如果2 * i <= n,则其左孩子(即左子树的根结点)的编号为2 * i;若2 * i > n,则无左孩子;
如果2 * i + 1<= n,则其右孩子的结点编号为2 * i + 1;若2 * i + 1 > n,则无右孩子。
二叉树的存储结构
1.顺序存储结构
二叉树的顺序存储时指用一组连续存储单元依次自上而下,自左向右存储完全二叉树上的结点元素,立即完全二叉树上编号为 i 的结点元素,即将完全二叉树上编号为i的结点元素存储在某个数组下标为 i - 1 的分量中;
顺序存储示意图如下:
【注】1. 完全二叉树和满二叉树采用顺序存储比较合适,节省空间且数组元素下标值能确定结点在二叉树中的位置和结点之间的关系。但对于一般二叉树,则需要添加一些并不存在的空结点,所以效率并不高。
2.二叉树属于树,因此二叉树都可以用树的存储结构来存储,但树却不能都用二叉树的存储结构来存储。
2.链式存储
顺序存储的空间利用率比较低,所以二叉树一般都采用链式存储结构。链式结构是指用一个链表来存储一棵二叉树,二叉树中的每个结点用链表的一个链结点来存储。 在二叉树中,结点结构通常包括若干数据域和若干指针域。二叉链表至少包含3个域:数据域data、左指针域lchild和右指针域rchild,若下图所示:
二叉链表存储结构如下图所示:
二叉树的链式存储结构算法如下:
typedef struct BiTNode{
ElemType data; //数据域
struct BiTNode *lchild, *rchild; //左、右孩子指针
}BiTNode, *BiTree;
【注】 在含有n个结点的二叉链表中,含有n+1个空链域。