【C++ 学习笔记】数据结构——树的概念和定义
一、基本概念
1.树
树是n(n≥0)n(n≥0)n(n≥0)个结点的有限集合TTT(Tree)。
当n=0n=0n=0时,称为空树;
当n>0n>0n>0时, 该集合满足如下条件:
- 其中必有一个称为根(root)的特定结点,它没有直接前驱,但有零个或多个直接后继。
- 其余n-1个结点可以划分成m(m≥0)m(m≥0)m(m≥0)个互不相交的有限集T1T_1T1,T2T_2T2,T3T_3T3,.........,TmT_mTm,其中TiT_iTi又是一棵树,称为根root的子树。 每棵子树的根结点有且仅有一个直接前驱,但有零个或多个直接后继。
图1.树的图示方法 图1.树的图示方法 图1.树的图示方法
2.树的相关概念
- 结点:包含一个数据元素及若干指向其它结点的分支信息。
- 结点的度:一个结点的子树个数称为此结点的度。
- 叶结点:度为000的结点,即无后继的结点,也称为终端结点。
- 分支结点:度不为000的结点,也称为非终端结点。
- 孩子结点:一个结点的直接后继称为该结点的孩子结点。
- 双亲结点:一个结点的直接前驱称为该结点的双亲结点。
- 兄弟结点:同一双亲结点的孩子结点之间互称兄弟结点。
- 祖先结点:一个结点的祖先结点是指从根结点到该结点的路径上的所有结点。在图1中,结点KKK的祖先是AAA、BBB、EEE。
- 子孙结点:一个结点的直接后继和间接后继称为该结点的子孙结点。在图1中,结点DDD的子孙是HHH、III、 JJJ、 MMM。
- 树的度: 树中所有结点的度的最大值。
- 结点的层次:从根结点开始定义,根结点的层次为111,根的直接后继的层次为222,依此类推。
- 树的高度(深度): 树中所有结点的层次的最大值。
- 有序树:在树TTT中,如果各子树TiT_iTi之间是有先后次序的,则称为有序树。
- 森林: m(m≥0)m(m≥0)m(m≥0)棵互不相交的树的集合。将一棵非空树的根结点删去,树就变成一个森林;反之,给森林增加一个统一的根结点,森林就变成一棵树。
二、二叉树的定义与基本操作
1.定义
我们把满足以下两个条件的树形结构叫做二叉树(Binary Tree):
- 每个结点的度都不大于2;
- 每个结点的孩子结点次序不能任意颠倒。
由此定义可以看出,一个二叉树中的每个结点只能含有000、 111或222个孩子,而且每个孩子有左右之分。我们把位于左边的孩子叫做左孩子,位于右边的孩子叫做右孩子。
图2.二叉树的五种基本形态 图2.二叉树的五种基本形态 图2.二叉树的五种基本形态
2.满二叉树
深度为kkk且有2k−12^{k}-12k−1个结点的二叉树。在满二叉树中,每层结点都是满的,即每层结点都具有最大结点数。 图3(a)所示的二叉树,即为一棵满二叉树。
满二叉树的顺序表示,即从二叉树的根开始, 层间从上到下, 层内从左到右,逐层进行编号(111, 222, ………, nnn)。例如图3(a)所示的满二叉树的顺序表示为(111, 222, 333, 444, 555, 666, 777, 888, 999, 101010, 111111, 121212, 131313, 141414, 151515)。
图3.满二叉树与完全二叉树 图3.满二叉树与完全二叉树 图3.满二叉树与完全二叉树
3.完全二叉树
深度为kkk,结点数为nnn的二叉树,如果其结点111 ~ nnn的位置序号分别与满二叉树的结点111 ~ nnn的位置序号一一对应(也就是深度为111 ~ k−1k-1k−1的所有结点都是满二叉树,第kkk层结点全部都靠在左边),则为完全二叉树, 如图3(b)所示。
满二叉树必为完全二叉树, 而完全二叉树不一定是满二叉树。
三、二叉树的性质
性质1: 在二叉树的第iii层上至多有2i−12^{i-1}2i−1个结点(i≥1)(i≥1)(i≥1)。
证明: 用数学归纳法。
归纳基础:当i=1i=1i=1时,整个二叉树只有一根结点,此时2i−1=20=12^{i-1}=2^{0}=12i−1=20