【C++ 学习笔记】数据结构——树的概念和定义
一、基本概念
1.树
树是 n ( n ≥ 0 ) n(n≥0) n(n≥0)个结点的有限集合 T T T(Tree)。
当 n = 0 n=0 n=0时,称为空树;
当 n > 0 n>0 n>0时, 该集合满足如下条件:
- 其中必有一个称为根(root)的特定结点,它没有直接前驱,但有零个或多个直接后继。
- 其余n-1个结点可以划分成 m ( m ≥ 0 ) m(m≥0) m(m≥0)个互不相交的有限集 T 1 T_1 T1, T 2 T_2 T2, T 3 T_3 T3, . . . ... ..., T m T_m Tm,其中 T i T_i Ti又是一棵树,称为根root的子树。 每棵子树的根结点有且仅有一个直接前驱,但有零个或多个直接后继。
图 1. 树的图示方法 图1.树的图示方法 图1.树的图示方法
2.树的相关概念
- 结点:包含一个数据元素及若干指向其它结点的分支信息。
- 结点的度:一个结点的子树个数称为此结点的度。
- 叶结点:度为 0 0 0的结点,即无后继的结点,也称为终端结点。
- 分支结点:度不为 0 0 0的结点,也称为非终端结点。
- 孩子结点:一个结点的直接后继称为该结点的孩子结点。
- 双亲结点:一个结点的直接前驱称为该结点的双亲结点。
- 兄弟结点:同一双亲结点的孩子结点之间互称兄弟结点。
- 祖先结点:一个结点的祖先结点是指从根结点到该结点的路径上的所有结点。在图1中,结点 K K K的祖先是 A A A、 B B B、 E E E。
- 子孙结点:一个结点的直接后继和间接后继称为该结点的子孙结点。在图1中,结点 D D D的子孙是 H H H、 I I I、 J J J、 M M M。
- 树的度: 树中所有结点的度的最大值。
- 结点的层次:从根结点开始定义,根结点的层次为 1 1 1,根的直接后继的层次为 2 2 2,依此类推。
- 树的高度(深度): 树中所有结点的层次的最大值。
- 有序树:在树 T T T中,如果各子树 T i T_i Ti之间是有先后次序的,则称为有序树。
- 森林: m ( m ≥ 0 ) m(m≥0) m(m≥0)棵互不相交的树的集合。将一棵非空树的根结点删去,树就变成一个森林;反之,给森林增加一个统一的根结点,森林就变成一棵树。
二、二叉树的定义与基本操作
1.定义
我们把满足以下两个条件的树形结构叫做二叉树(Binary Tree):
- 每个结点的度都不大于2;
- 每个结点的孩子结点次序不能任意颠倒。
由此定义可以看出,一个二叉树中的每个结点只能含有 0 0 0、 1 1 1或 2 2 2个孩子,而且每个孩子有左右之分。我们把位于左边的孩子叫做左孩子,位于右边的孩子叫做右孩子。
图 2. 二叉树的五种基本形态 图2.二叉树的五种基本形态 图2.二叉树的五种基本形态
2.满二叉树
深度为 k k k且有 2 k − 1 2^{k}-1 2k−1个结点的二叉树。在满二叉树中,每层结点都是满的,即每层结点都具有最大结点数。 图3(a)所示的二叉树,即为一棵满二叉树。
满二叉树的顺序表示,即从二叉树的根开始, 层间从上到下, 层内从左到右,逐层进行编号( 1 1 1, 2 2 2, … … …, n n n)。例如图3(a)所示的满二叉树的顺序表示为( 1 1 1, 2 2 2, 3 3 3, 4 4 4, 5 5 5, 6 6 6, 7 7 7, 8 8 8, 9 9 9, 10 10 10, 11 11 11, 12 12 12, 13 13 13, 14 14 14, 15 15 15)。
图 3. 满二叉树与完全二叉树 图3.满二叉树与完全二叉树 图3.满二叉树与完全二叉树
3.完全二叉树
深度为 k k k,结点数为 n n n的二叉树,如果其结点 1 1 1 ~ n n n的位置序号分别与满二叉树的结点 1 1 1 ~ n n n的位置序号一一对应(也就是深度为 1 1 1 ~ k − 1 k-1 k−1的所有结点都是满二叉树,第 k k k层结点全部都靠在左边),则为完全二叉树, 如图3(b)所示。
满二叉树必为完全二叉树, 而完全二叉树不一定是满二叉树。
三、二叉树的性质
性质1: 在二叉树的第 i i i层上至多有 2 i − 1 2^{i-1} 2i−1个结点 ( i ≥ 1 ) (i≥1) (i≥1)。
证明: 用数学归纳法。
归纳基础:当 i = 1 i=1 i=1时,整个二叉树只有一根结点,此时 2 i