二叉树
二叉树是一种特殊的顺序树结构,它规定了一个节点只能有两个子节点,即只能拥有两个子树。左子树和右子树是有顺序的,次序不能颠倒,所以二叉树是有序树。即使只有一个子树,也要区分左右。
典型二叉树图
TIM截图20180106143801.png
这是一个典型的满二叉树,每个根节点有且只有两个子节点。
满二叉树是一个完全二叉树。
二叉树的遍历
前序:
顺序:中左右。
根节点->左子树->右子树。
即先遍历根节点,再遍历左子树,最后遍历右子树。
上图中主根节点是A,所以先遍历的是A。
之后遍历左子树,左子树又是一个二叉树,依然遵循二叉树的遍历规则,所以先遍历根节点,此时根节点是B,所以第二步遍历B。
之后再遍历依B为根节点的二叉树的左子树,此时只有C结点,C为最外层的叶子结点,所以遍历C。
此时以B为根节点的二叉树的根节点和左子树已经遍历完毕,之后遍历右子树。右子树只有D结点,所以遍历D。
此时以B为根节点的所有结点遍历完毕,遍历完成度如下。
TIM截图20180106143833.png
接下来就要遍历根节点为A的右子树,右子树也是一个二叉树,依然遵循二叉树的遍历规则。先遍历根节点E。
E节点存在子节点,所以接下来遍历E的左子树F,F不存在子节点。
接下来遍历E的右子树G。
最终遍历结果是:ABCDEFG。
TIM截图20180106143859.png
中序:
遍历顺序:左中右
左子树->根节点->右子树
中序遍历需要先遍历左子树,由上而下先遍历以A为根的左子树,则是以B为根的二叉树,继续向下,是以B为根的二叉树的左子树,为结点C。C后不存在子节点,所以遍历完毕。
接下来遍历C子树的所属二叉树的根,即B结点。
然后遍历B为根的二叉树的右子树,为结点D
此时以B为根节点的二叉树已经遍历完毕,即以A为根节点的二叉树的左子树遍历完毕,按照规则接下来遍历根节点,即A。
根节点遍历完毕,接下来遍历右子树。右子树是以E为根节点的二叉树。依然要遵循二叉树的遍历规则。所以先遍历左子树。
左子树是结点F,且没有子节点。
接下来遍历根节点E
然后遍历以E为根节点的右子树G。
遍历完成后以E为根节点的二叉树已经遍历完毕,且以A为根节点的二叉树的右子树也遍历完毕,整个二叉树遍历完毕。
最终遍历结果是:CBDAFEG
TIM截图20180106143924.png
后序:
遍历顺序:左右中
左子树->右子树->根节点
后序遍历先左子树,再遍历右子树,最后遍历根节点。
由上而下,结点A存在子节点,所以先遍历树的左子树,即是以B为根节点的二叉树,依然存在子节点。按照遍历规则,先遍历左子树C,C不存在子节点,遍历结束。
接下来遍历右子树D,遍历结束。
接下来遍历根节点B,以B为根节点的二叉树遍历完毕。即以A为根节点的二叉树的左子树遍历完毕,接下来遍历以A为根节点的右子树。
右子树是以E为根节点的二叉树,依然遵循二叉树的遍历规则,遍历以E为根节点的二叉树的左子树F,F不存在子节点,遍历结束。
然后遍历以E为根节点的右子树G,遍历完毕。
然后遍历根节点E,此时以E为根节点的二叉树遍历完毕,即以A为根节点的二叉树的右子树遍历完毕,接下来遍历根节点A。遍历完毕。
最终遍历结果是:CDBFGEA
TIM截图20180106143948.png
哈夫曼树
哈夫曼树又称最优树。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。
假设字符A、B、C、D在电文中出现的概率分别是0.1、0.2、0.3、0.4,求出这些字符的哈夫曼编码。
首先按照概率排序得到{0.1,0.2,0.3,0.4}。
为了方便计算都扩大100倍。
最小的10+20 = 30。
然后小的是30 + 30 = 60。
剩下的40比60小。
所以简单的树结构就出来了
(40,((10,20),30))
树结构图如下。
hfms.png
设计哈夫曼编码简单的原则是左0右1。
得到如下编码:
A:100
B:101
C:11
D:0
欢迎大家关注我的个人订阅号,一起学习一起交流
ajsoft.jpg