二叉树遍历和哈夫曼编码

二叉树

二叉树是一种特殊的顺序树结构,它规定了一个节点只能有两个子节点,即只能拥有两个子树。左子树和右子树是有顺序的,次序不能颠倒,所以二叉树是有序树。即使只有一个子树,也要区分左右。

典型二叉树图

《二叉树遍历和哈夫曼编码》 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

    原文作者:Alfredjin
    原文地址: https://www.jianshu.com/p/bb770268cc0b
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞