第四章:树
树的基本概念
- 树是递归定义的结构
- 结点
- 根节点:树只有一个根结点
- 结点的度:结点拥有的子树的数量
- 度为0:叶子结点或者终端结点
- 度不为0:分支结点或者非终端结点
- 分支结点除去根结点也称为内部结点
- 树的度:树中所有结点的度数的最大值
- 结点关系
- 祖先结点
- 根结点到该结点的唯一路径的任意结点
- 子孙结点
- 双亲结点
- 根结点到该结点的唯一路径上最接近该结点的结点
- 孩子结点
- 兄弟结点
- 有相同双亲结点的结点
- 祖先结点
- 层次,高度,深度,树的高度
- 层次:根为第一层,它的孩子为第二层,以此类推
- 结点的深度:根结点开始自顶向下累加
- 结点的高度:叶节点开始自底向上累加
- 树的高度(深度):树中结点的最大层数
- 树的性质
- 1.树中的结点数等于所有结点的度数加1。
- 证明:不难想象,除根结点以外,每个结点有且仅有一个指向它的前驱结点。也就是说每个结点和指向它的分支一一对应。
假设树中一共有b个分支,那么除了根结点,整个树就包含有b个结点,所以整个树的结点数就是这b个结点加上根结点,设为n,则n=b+1。而分支数b也就是所有结点的度数,证毕。
- 证明:不难想象,除根结点以外,每个结点有且仅有一个指向它的前驱结点。也就是说每个结点和指向它的分支一一对应。
- 2.度为m的树中第i层上至多有m^(i−1)个结点(i≥1)。
- 证明:(数学归纳法)
首先考虑i=1的情况:第一层只有根结点,即一个结点,i=1带入式子满足。
假设第i-1层满足这个性质,第i-1层最多有m i-2个结点。
……… …
i-1层
………
又因为树的度为m,所以对于第i-1层的每个结点,最多
有m个孩子结点。所以第i层的结点数最多是i-1层的m
倍,所以第i层上最多有m ^(i-1)个结点。
- 证明:(数学归纳法)
- 3.高度为h的m叉树至多有(m^h-1)/(m-1)个结点
- 4.具有n个结点的m叉树的最小高度为logm(n(m-1)+1)
- 1.树中的结点数等于所有结点的度数加1。
树的存储结构
- 顺序存储结构
- 双亲表示法:用一组连续的存储空间存储树的结点,同时在每个结点中,用一个变量存储该结点的双亲结点在数组中的位置。
- 链式存储结构
-
孩子表示法:把每个结点的孩子结点排列起来存储成一个单链表。所以n个结点就有n个链表;
如果是叶子结点,那这个结点的孩子单链表就是空的;
然后n个单链表的的头指针又存储在一个顺序表(数组)中。 -
孩子兄弟表示法:顾名思义就是要存储孩子和孩子结点的兄弟,具体来说,就是设置两个指针,分别指向该结
点的第一个孩子结点和这个孩子结点的右兄弟结点。
-
二叉树
- 定义
- 二叉树是n(n≥0)个结点的有限集合:
① 或者为空二叉树,即n=0。
② 或者由一个根结点和两个互不相交的被称为根的左子树
和右子树组成。左子树和右子树又分别是一棵二叉树。- 1.每个结点最多有两棵子树。
- 2.左右子树有顺序
- 二叉树是n(n≥0)个结点的有限集合:
- 二叉树的五种基本形态:
-
- 1.空树
- 2.只有一个根结点
- 3.根结点只有左子树
- 4.根结点只有右子树
- 5.根结点既有左子树又有右子树
- 特殊二叉树
- 1.斜树:只有左儿子或只有右儿子
- 2.满二叉树(完美二叉树):除最后一层叶结点外,每个结点都有两个子结点
- 3.完全二叉树:有 n 个结点的二叉树,对树中结点按从上至下、从左到右顺序进行编号,编号为 i(1 ≤ i ≤ n)结点与满二叉树中编号为 i 结点在二叉树中位置相同
- 1.斜树:只有左儿子或只有右儿子
- 二叉树的性质
- 1.非空二叉树上叶子结点数等于度为2的结点数加1
- 2.非空二叉树上第K层上至多有2^k−1个结点(K≥1)
- 3.高度为H的二叉树至多有2^H-1个结点(H≥1)
- 4.具有N个(N>0)结点的完全二叉树的高度为 [log2(N+1)]或[log2N] +1。
二叉树的存储结构
- 顺序存储
- 二叉树的顺序存储结构就是用一组地址连续的存储单元依次自上而下、自左至右存储完全二叉树上的结点元素。
- 二叉树的顺序存储结构就是用一组地址连续的存储单元依次自上而下、自左至右存储完全二叉树上的结点元素。
- 链式存储
- 二叉树每个结点最多两个孩子,所以设计二叉树的结点结构时考虑两个指针指向该结点的两个孩子。
- 二叉树每个结点最多两个孩子,所以设计二叉树的结点结构时考虑两个指针指向该结点的两个孩子。
typedef struct TreeNode *BinTree;
struct TreeNode{
Element Data; // 存值
BinTree Left; // 左儿子结点
BinTree Right; // 右儿子结点
};