第五章 树与二叉树
文章目录
- 知识框架图
- 考纲内容以及重难点
- 考纲内容
- 重难点
- 树和森林
- 基本概念
- 树的性质
- 树的存储结构
- 双亲表示法
- 孩子表示法
- 孩子兄弟表示法
- 森林
- 二叉树
- 二叉树的定义
- 二叉树的性质
- 二叉树的存储结构
- 顺序存储结构
- 链式存储结构
- 二叉树的遍历
- 先序遍历(PreOrder)
- 中序遍历(InOrder)
- 后序遍历(PostOrder)
- 层次遍历
- 由遍历序列构造二叉树
- 线索二叉树
- 线索二叉树的基本概念
- 中序线索二叉树
- 先序线索二叉树
- 后序线索二叉树
- 哈夫曼树和哈夫曼编码
- 哈夫曼树的定义
- 哈夫曼树的构造
- 哈夫曼树的性质
- 哈夫曼编码
- 树和森林的遍历
- 树的遍历
- 先根遍历
- 后根遍历
- 森林的遍历
- 先序遍历森林
- 中序遍历森林
- 树、森林与二叉树的转换
- 树转换为二叉树
- 森林转换为二叉树
- 二叉树转换为森林
- 错题
今日格言:积极的人在每一次忧患中都看到一个机会,而消极的人则在每个机会都看到某种忧患。
知识框架图
考纲内容以及重难点
考纲内容
- 树的基本概念
- 树的存储结构
- 二叉树的顺序存储结构和链式存储结构
- 二叉树的遍历
- 线索二叉树的基本概念和构造
- 森林和二叉树的转换
- 树和森林的遍历
- 哈夫曼(Huffman)树和哈夫曼编码
统考以选择题和大题的形式考察本章。选择题考点较多,大多数不难,树和二叉树的性质,二叉树的应用,二叉树的遍历等等。大题考过和树遍历相关的算法题。
重难点
显然从标题就可以看出二叉树是重难点,各种遍历操作之类的。
树和森林
基本概念
树是n(n≥0)个结点的有限集。当n=0时,称为空树
。
在任意一棵非空树中应满足:
- 有且仅有一个特定的称为根的结点。
- 当n大于1时,其余结点可分为m(m>0)个互不相交的有限集T1,T2,…TmT_1,T_2,…T_mT1,T2,…Tm,其中每个集合本身又是一棵树,并且称为根的
子树
。
由此可以看出,树是一种递归的数据结构,因为在树的定义中用到了其自身。
树适用于表示具有层次结构的数据,例如:族谱、文件系统以及思维导图。
树的性质
树中的某个结点(除根节点外)最多只和上一层的一个结点(即其双亲结点)有直接关系,根节点没有直接上层结点,因此在n个结点的树中有n-1条边。简而言之:
- 树的根结点没有前驱,除根节点外的所有结点有且只有一个前驱。
- 树中所有结点都可以有零个或多个后继。
有序树:树中结点的各子树从左到右是有次序的,不能互换,称该树为有序树,否则称为无序树。
树的存储结构
依旧采用顺序存储或者链式存储结构,但无论采用何种存储方式,都要求能唯一地反映树中各结点间的逻辑关系。
双亲表示法
有点类似于树的层次遍历,这种存储结构采用一组连续空间来存储每个结点,同时在每个结点中增设一个伪指针(数组下标),指向其双亲结点在数组中的位置。
双亲表示法的存储结构可定义如下:
#define MAX_TREE_SIZE 100
typedef struct {
ElemType data;
int parent; //伪指针
}PTNode;typedef struct{
PTNode nodes[MAX_TREE_SIZE]; //双亲表示数组
int n; //结点数
}
孩子表示法
孩子兄弟表示法
森林
如下图所示:可以看出只要把根节点删去就成了森林。反之,只要给m棵独立树加上一个结点,并把这m棵树作为该结点的子树,则森林就变成了树。
二叉树
二叉树的定义
二叉树的性质
二叉树的存储结构
顺序存储结构
链式存储结构
二叉树的遍历
先序遍历(PreOrder)
中序遍历(InOrder)
后序遍历(PostOrder)
层次遍历
由遍历序列构造二叉树
线索二叉树
线索二叉树的基本概念
中序线索二叉树
先序线索二叉树
后序线索二叉树
哈夫曼树和哈夫曼编码
哈夫曼树的定义
哈夫曼树的构造
哈夫曼树的性质
哈夫曼编码
树和森林的遍历
树的遍历
树的遍历是指用某种方式访问树中的每个结点,且仅访问一次。主要有先根遍历和后根遍历这两种方式:
先根遍历
若树非空,则按如下规则遍历:
- 先访问根节点
- 再依次遍历根结点的每棵子树,遍历子树时仍遵循先根后子树的规则。
其遍历序列与这棵树相应二叉树的先序序列(根左右)相同。
后根遍历
若树非空,则按如下规则遍历:
- 先依次遍历根结点的每棵子树,遍历子树时仍遵循先子树后根的规则。
- 再访问根节点。
其遍历序列与这棵树相应二叉树的中序序列相同。
树也有层次遍历,与二叉树的层次遍历思想基本相同,即按层序依次访问各结点。
森林的遍历
森林有两种遍历方法:
先序遍历森林
若森林为空,则按如下规则遍历:
- 访问森林中第一棵树的根节点
- 先序遍历第一棵树中根节点的子树森林
- 先序遍历除去第一棵树之后剩余的树构成的森林
中序遍历森林
森林为空时,按如下规则遍历:
- 中序遍历森林中第一棵树的根节点的子树森林
- 访问第一棵树的根节点
- 中序遍历除去第一棵树之后剩余的树构成的森林
树、森林与二叉树的转换
树转换为二叉树
左孩子右兄弟法,因为根节点没有兄弟,因此树转换得到的二叉树没有右子树。
森林转换为二叉树
每棵树都左孩子右兄弟,然后再依次将第i棵二叉树作为第i-1棵二叉树的右子树。
二叉树转换为森林
和森林转化为二叉树的过程正好逆过来,先断链,再分别将二叉树转为树。