树
树的相关定义:
1.度
结点的度:结点的子树的个数;
树的度:结点度的最大值;
2.深度
结点的层次:从根开始(第一层),依次往后瑞;
深度:节点最大层次;
- 有序树,无序树
字面理解, 子树从左至右有无顺序;
- 森林:m棵不相交树;
树的存储结构:
存储结构:
- 顺序结构;
- 链式结构;
表示方法:
- 双亲表示法;
- 孩子表示法;
- 孩子兄弟表示法;★
孩子兄弟表示法
两个指针,指向该节点第一个孩子和右兄弟;
二叉树
定义:n个结点的有限集合,该集合由一个根节点和互不相交的、分别成为根节点的左子树和右子树的二叉树组成。(或空集,空二叉树)
二叉树特点:
- 度:二叉树度<=2 :因为每个结点最多两个子树,(但不是一定有两个结点,有可能有1/0个结点)
- 有序树:区分左子树和右子树;
特殊二叉树:
- 满二叉树:每个结点都存在左右子树,所有叶子在同一层;(共2^n-1满的)
- 完全二叉树:★(只有最后一行没满)
完全二叉树的特点:
1.叶子结点只能出现在最下面两侧;
最下面一层的叶子在左部连续部分;
倒数第二层,如果有叶子,则一定在右部;
- 结点度为1,则结点只有左孩子(不可能只有右孩子,不连续);
- 同样结点数的二叉树,完全二叉树的深度最小;
二叉树的代数性质:
- 第i层最多有2^(i-1)个结点;
- 深度为k的结点至多有2^i-1个结点;
- 叶子结点数=度为2的节点数+1;
- n个结点的二叉树的深度是[log2n]+1;
二叉树的遍历:(重点题型!!!)
- 前序遍历:亲,左孩子,右孩子(先访问根节点,后
- 中序遍历:左孩子,亲,有孩子
- 后序遍历:左孩子,有孩子,亲
(先,中,后代表的是根节点相对两个孩子的位置)
易考题型:
- 先序遍历+中序遍历->后序遍历(知二推一)
- 后序遍历+中序遍历_>先序遍历
- 由前序遍历+后序遍历不能推到中序遍历。(两者不能唯一确定二叉树)
树的存储结构:
- 双亲表示法;储存每一个结点的双亲
- 孩子表示法;储存每一个结点的孩子
- 孩子兄弟表示法;储存每个结点的右兄弟和第一个孩子;
(转化成用二叉链表表示)
树的结构转换
树<-->二叉树
树 | 二叉树 |
结点X的第一个孩子 | 结点X的左孩子 |
结点X的右兄弟 | 结点X的右孩子 |
树转化成二叉树的步骤
- 加线:兄弟结点之间加线;
- 去线:只保留每个结点与第一个左孩子的连线,删掉与其他孩子的连线;
- 转轴;
森林转化成二叉树
森林:把每一棵树的根节点理解成兄弟;
二叉树转化成森林
二叉树->树(根节点只有左孩子)
二叉树->森林(根节点有左右孩子)
哈夫曼树
最优二叉树:带权路径长度最小
Ps:带权路径:从根到该结点的路径长度与结点的权的乘积
★哈夫曼树的构造方法
- 将所有带权结点按照权值从小到大排列;
- 选择最小的两个结点作为新节点N1的左右孩子(小的左,大的右)
- 用构成的新节点替换原来的两个小结点,循环开始;
- 直到最后只剩下一个树,这个树就是哈夫曼树。
哈夫曼编码:(可以压缩数据长度)
最优前缀编码,根据字符出现的频率编码,使得到的电文长度最短。
前缀编码:长短不一的编码,任一字符的编码都不是另一个字符的编码的前缀(防止混淆)
具体编码过程:
- 以字符出现的频率为权,构造哈夫曼树;
- 结点指向左孩子的分支记为“0”,右孩子的分支为“1”。
具体译码过程
1.从根结点开始,0——>向左走,1-->向右走,直到遇到叶子结点为止。