树和二叉树
树的定义和基本术语
树是一种递归定义的数据结构
有序树——逻辑上看,树中结点的各子树从左至右是有次序的,不能互换
无序树——逻辑上看,树中结点的各子树从左至右是无次序的。可以互换
有次序还是无次序是具体看你用树来存什么,是否需要用结点的左右位置来反映某些逻辑关系
森林:森林是m(m>=0)棵互不相交的树的集合
二叉树的定义和基本术语
二叉树的顺序结构,只适合存储完全二叉树
- 完全二叉树的常考性质
- 二叉树的存储方式
二叉树的先中后遍历
先序遍历:根左右
中序遍历:左根右
后序遍历:左右根
先中后遍历其实就是看根的位置
先序:第一次路过时访问,中序:第二次路过时访问,后序:第三次路过时访问
二叉树的层序遍历
由遍历序列构造二叉树
一个中序的遍历序列可能构造成多种不同的二叉树形态,给定一个二叉树,他的中序二叉树遍历的次序时唯一的,但是给定一个中序遍历的序列,给定二叉树的形态时不唯一的
前序遍历,中序遍历,后序遍历都拥有相同的结论
结论:若只给出一棵二叉树的前/中/后/层序遍历序列的一种,都是不能唯一确定一棵树
前序+中序遍历序列
后序+中序遍历序列
层序+中序遍历序列
如果拥有这两种序列就可以确定二叉树的形态,但是必须拥有中序遍历,因为在进行遍历的时候,前序和后序遍历顺序可能相同,无法确定
二叉树的线索化
易错点:最后一个结点的rchild rtag 的处理还有先序线索化中,注意处理爱的魔力转圈圈的问题,当ltag==0时,才能对左子树进行先序线索化
树的存储结构
树是一种由递归定义的数据结构
- 双亲表示法:顺序存储结点数据,结点中保存父结点在数组中的下标,优点:找父结点方便;缺点:找孩子不方便
- 孩子表示法:顺序存储结点数据,结点中保存孩子的链表头指针(顺序+链式存储),优点:找孩子方便;缺点:找父结点不方便
- 孩子兄弟表示法:用二叉链表存储树——左孩子右兄弟,孩子兄弟表示法存储的树,从存储视角来看形态和二叉树类似,考点就是树与二叉树的相互转换,本质就是用孩子兄弟表示法存储树
- 森林与二叉树的转换:本质就是用二叉链表来存储森林——左孩子右兄弟,森林中各个树的根结点之间视为兄弟关系
树和森林的遍历
- 树的先根遍历
先根遍历:若树非空,先访问根结点,再依次对每一棵子树进行先根遍历
- 树的后根遍历(优先深度遍历)
- 树的层次遍历(优先广度遍历)
- 森林的先序遍历
- 森林的中序遍历
树 | 森林 | 二叉树 |
---|---|---|
先根遍历 | 先序遍历 | 先序遍历 |
后根遍历 | 中序遍历 | 中序遍历 |
二叉排序树
二叉排序树,又称二叉查找树,一棵二叉树或者空二叉树,或者是具有下列性质的树,左子树所有的结点关键字均小于根结点的关键字,右子树所有的结点的关键字均大于根结点的关键字,左子树和右子树又是一棵二叉排序树
进行中序遍历的时候就能够得到一个递增的有序序列
平衡二叉树
平衡二叉树,又称为平衡树,(AVL树),树上任一结点的左子树和右子树的高度差不超过1
哈夫曼树
可变长度编码:允许对不同字符用不等长的二进制表示
固定长度编码:每个字符用相等长度的二进制表示
若没有一个编码时另一个编码的前缀,则称这样的编码为前缀编码
有哈夫曼树得到的哈夫曼编码——字符集中的每一个字符作为一个叶子结点,各个字符出现的频度作为结点的权值,根据之前的方法来构造哈夫曼树,哈夫曼树可以用于是数据压缩(注意这里的字符只可以作为叶子结点)