二叉树的定义
一个有穷的结点集合。 这个集合可以为空;若不为空,则它是由根结点和称为其左子树和右子树的两个不相交的二叉树组成。
*注意:二叉树的定义是一种递归定义;二叉树的子树有左右顺序之分 *
特殊的二叉树
①斜二叉树(Skewed Binary Tree)
即均为左子树或右子树。可继续分为斜右二叉树和斜左二叉树。下图为斜左二叉树。
②完美二叉树(Perfect Binary Tree) 或 满二叉树(Full Binary Tree)
在一棵二叉树中,如果所有分支结点都有左孩子结点和右孩子结点,并且叶结点都集中在二叉树的最下一层。结点的孩子一定是都有或都没有。
③完全二叉树 (Complete Binary Tree)
若二叉树中最多只有最下面两层的结点的度数可以小于2,并且最下面一层的叶结点都依次排列在该层最左边的位置上。
二叉树的几个重要性质
(举例式理解,理解式记忆。)
①一棵非空二叉树上第i层上至多有2^(i-1)个结点(i≥1)。
题例:已知一棵完全二叉树的第6层(设根为第1层)有8个叶节点,则该完全二叉树的节点个数最多是 111。
(本题为2009年全国考研题)
②一颗高度为k的二叉树至多有2^k - 1个结点(k≥1)。
③对于一棵非空的二叉树,如果叶子结点数为n0,度数为2的结点数为n2,则有: n0=n2+1。
证明:设二叉树上叶节点数为n0,单分支节点数为n1,双分支节点数为n2,则总节点数n=n0+n1+n2。在一棵二叉树中,所有节点的分支数(即度数)应等于单分支节点数加上双分支节点数的2倍,即总的分支数=n1+2n2。
由于二叉树中除根节点以外,每个节点都有唯一的一个分支指向它,因此二叉树中有:总的分支数=总节点数-1。
由上述三个等式可得:n1+2n2=n0+n1+n2-1 即:n0=n2+1
其中,有一个关于树的重要基本性质:一棵n个结点的树有n-1条边。(n>=1)
④
其中的特殊符号为向下取整。
二叉树的存储结构
①顺序存储结构
二叉树的顺序存储结构中结点的存放次序是:对该树中每个结点进行编号,其编号从小到大的顺序就是结点存放在连续存储单元的先后次序。
顺序存储结构适用于完全二叉树,而一般的二叉树先用空节点补全成为完全二叉树,然后对结点编号后再顺序存储。一般二叉树也可以采用这种结构,但会造成空间浪费。
//二叉树的顺序存储表示可描述为:
#define MAXNODE 100 /*二叉树的最大结点数*/
typedef elemtype SqBiTree[MAXNODE] /*1号单元存放根结点*/
SqBiTree bt; /*即将bt定义为含有MAXNODE个elemtype类型元素的一维数组*/
②链表存储或链式存储
二叉树的链式存储结构是用指针来指示元素的逻辑关系,即用两个指针分别指向结点的左孩子和右孩子。二叉树中的每一个结点由三个域组成,数据域和两个指针域。结点结构定义如下:
其中,data表示值域,用于存储对应的数据元素,lchild和rchild分别表示左指针域和右指针域,用于分别存储左孩子结点和右孩子结点(即左、右子树的根结点)的存储位置。
//二叉树的二叉链存储表示可描述为:
typedef struct node{
ElemType data; /* 存放结点的值,ElemType是元素的基本类型 */
struct node *lchild; /* 指向左孩子结点指针*/
struct node *rchild; /* 指向右孩子结点指针 */
} BTNode;
二叉树的一些基本操作,如:创建二叉树、找指定结点、找孩子结点、求二叉树的高度、输出二叉树。
二叉树的遍历(递归和非递归算法)
各种树
二叉搜索树/二叉排序树/二叉查找树
平衡二叉树(AVL Tree)
B-和B+树的定义、性质特点、举例说明
线索二叉树
哈夫曼树Huffman Tree及其应用——哈夫曼编码