树
树是n个结点的有限集,n=0时为空树,任意一个非空树有以下特征:
1.有且仅有一个根
2.n>1时,有m个互不相交的集合,每个集合本身时一棵树,称为根的子树
每一圈是一个结点。结点拥有的子树数是度,树的度取各结点度的最大值,如图
度为0 就是叶结点或者终端结点
度不为0 就是分支结点或者非终端结点,也是内部节点
树的深度depth为结点的最大层level
树的存储结构
双亲表示法
孩子表示法
双亲孩子表示法
二叉树
子树在2或者2以内就可以
左子树和右子树是有顺序的,不可以颠倒
二叉树的5种形态
特殊二叉树
斜树:一支流,往左或者往右斜
满二叉树:除了叶子结点以外,其他的结点都是满度,度数为2
叶子只能出现在最下一层。同样深度的二叉树,满二叉树的结点是最多的,叶子也是最多的
满二叉树vs完全二叉树
完全二叉树:叶子只能出现在最下两层,最下层的叶子一定集中在左部连续位置,能断开的只能是右边。如果结点度数为1,该结点只能由左孩子,这样序号才能连在一起
满二叉树一定是完全二叉树,但是完全二叉树不一定是满二叉树
二叉树的存储结构
顺序:一维数组存储二叉树的各个结点,结点的存储位置能够体现结点之间的逻辑关系
完全二叉树的严格定义,数组可以直接表现出逻辑结构
一般二叉树,尽管层序编号不能反映逻辑关系,也可以在完全二叉树的编号方式上修改,不存在的结点用^代替
斜树,如果是右斜树
顺序的适用性不强,考虑链式存储,设计一个数据域和两个指针域上图为二叉链表
二叉树的遍历
从根节点出发,安某种次序依次访问二叉树中所有结点,使每个结点被访问一次且只有一次。树的结点之间不存在唯一的前驱和后继这样的关系,在访问一个结点后,下一个结点面临不同的选择
如果限制从左到右的习惯方式,那么主要分为以下四种:
前序遍历:先访问根节点。然后前序遍历左子树,再前序遍历右子树
中序遍历:左子树,根节点,右子树。没有左子树就访问根结点
后序遍历
从左到右,先叶子后结点的顺序遍历访问左右子树,最后访问根。
层序遍历
从树的第一层,就是根节点开始,从上到下逐层遍历,在同一层中,按从左到右的顺序对结点逐个访问。
线索二叉树
中序遍历拯救世界
这里推荐一片实用的解析线索二叉树文章
树,森林,二叉树的转换
如果所有树都像二叉树一样方便处理就好了
普通树转二叉树
森林转二叉树
注意:普通树转二叉树,只有左子树;森林转二叉树,有左子树也又右子树。
二叉树到树和森林的转换-逆向过程
总结:一棵二叉树能不能转成森林,要看他有没有右子树,有就可以,否则就只能转换成森林
树和森林的遍历
树的遍历,分为先根遍历和后根遍历
遍历这棵二叉树
先根遍历:ABEFCGDHIJ
后根遍历: EFBGCHIJDA
森林也是分为前序遍历和后序遍历
敲黑板!
树和森林的前序遍历 和 二叉树的前序遍历结果一致
树和森林的后序遍历 和 二叉树的中序遍历结果一致
因此,解决的了复杂问题
赫夫曼树
无损压缩编码方案:如何使电文总长最短且不产生二义性
1.把二叉树简化为叶子结点带权值的二叉树
2.计算树的带权结点长度WPL
3.比较WPL。就像比较导航给的两种路径一样。WPL值越小,路径越短,构造出来的二叉树性能最优。
4.最优二叉树就是赫夫曼树
赫夫曼树构造过程动画
规律是先选权值最小的构造,小的放左边,大的放右边,不断往里加权值小的哪一个,比较根,更小放左边,更大放右边
赫夫曼编码
感兴趣的看看