树
1、普通的树
这个好像没什么好说的,唯一就是记住下面一些点。
- 树边与节点关系,边数量=节点数量-1,考虑到个节点都从父亲那边拿了一条边,而根节点没有,所以就差1,做题很好用
- 度为m的树,所有节点之和为
2、二叉树分类
- 满二叉树
- 完全二叉树
- 普通二叉树,这没啥好说的。
3、二叉树存储结构
-
顺序存储
对于满二叉树和完全二叉树,最适合了
-
结论1、为什么下标为i节点(下标从0开始)的左右孩子分别为2i+1、2i+2,设i节点在第h层,i节点左边有m个,右边有n个,左孩子下标为g
第0~h-1层总共有个节点
i左边有m个节点,顺序存储中,i前面就有个节点
所以i的下标就是,得到公式①:
第h层有个节点,那么得到公式②:
i与g之间应该有个节点,所以有公式③:
联立公式①②③:
-
结论2、g节点的父母是,证明跟上面一样
-
-
链式存储
左指针,数据域,右指针
4、二叉树的性质
假设分别表示度为0,1,2的节点个数,表示总结点个数,表示边,表示高度,下面对任意二叉树都成立。
5、二叉树的遍历
-
前序遍历
先遍历根节点,再遍历左子树,最后遍历右子树。如果有为空的,直接跳过。
-
中序遍历
先遍历左子树,再遍历根节点,最后遍历右子树。如果有为空的,直接跳过。
-
后序遍历
先遍历左子树,再遍历右子树,最后遍历根节点。如果有为空的,直接跳过。
-
前序遍历与后序遍历序列恰好相反
该二叉树的节点数等于树高
该二叉树的中序遍历便是,依次去掉前序遍历的值和中序的值,接下来的值在中序中的值应该是两边而不是中间。
6、线索二叉树
7、树与森林
1)树的存储结构
- 双亲表示法
- 孩子表示法
- 孩子兄弟表示法
2)树、森林、二叉树的转换
树 | 森林 | 二叉树 |
---|---|---|
先根遍历 | 先序遍历 | 先序遍历 |
后根遍历(中根遍历) | 中序遍历 | 中序遍历 |
-
遍历方式
-
树
先根遍历:先遍历根,再按先根遍历依次遍历子树。
后根遍历(中根遍历):先按后根遍历依次遍历子树,再遍历根。
-
森林
先序遍历:先访问第一棵树的根节点,再按先序遍历依次遍历第一棵树的子树森林,最后遍历森林中剩下的森林。
中序遍历:先按中序遍历遍历第一棵树的子树森林,再访问根,最后遍历森林剩下的森林。
-
-
若F是一个森林,B是由F变换成的二叉树
- 假设F有n个非终端节点,求B中无右孩子的结点数?
答:F中每一个非终端节点
Node
的m个孩子,转换到B中,应该有一个无右孩子(Node
的最右边那个孩子)。F中最右边的树的根节点也不会有右孩子的。所以总共无右孩子的节点数为n+1。同理,若F是一棵树,也可以推导一些定理。- F中的叶节点和B的关系
答:F中的叶节点数是B中左孩子为空的节点数。因为B中左孩子为空的话,说明在F中没有子树,那么就说明是叶节点。
8、哈夫曼树
若没有一个编码是另一个编码的前缀,称这样的编码为前缀编码,前缀编码可以被唯一翻译。
-
哈夫曼树:带权路径(WPL)最小的树
-
哈夫曼树构造过程
下面四个节点,字母代表节点名称,数字代码权重
选取所有节点中最小的两个节点,构造新节点代替两个旧节点,一直重复,知道只剩一个节点
这样生成的带权路径最短,就是一颗哈夫曼树了。
-
哈夫曼树特点
只有度为0和度为2的节点:即,且根据树的特点有:
度为m的哈夫曼树,那就只有度为0和度为m的两种节点。
一个叶节点对应一个码字
并查集
通常使用双亲表示法的树作为存储结构,注意不一定是二叉树了。每个集合表示为一棵树,所有的集合,表示成为森林了。并查集最重要的三个操作:Initial(S)初始化
、Union(S, Root1, Root2)联合
、Find(S,x)查找
。