几个技术问题,已知前序遍历中序遍历求后序遍历,哈弗曼编码,建立初始堆

来源:互联网 发布:毒药法术升级数据 编辑:程序博客网 时间:2024/06/07 10:53

一、已知前序遍历、中序遍历求后序遍历(可参考:link)
首先,对于
这里写图片描述
前序遍历:a->b->c(第一个字母是根节点)
中序遍历:b->a->c
后序遍历:b->c->a

例题:
已知
前序遍历: GDAFEMHZ
中序遍历: ADEFGHMZ
求后序遍历
根据前序遍历可知,G为根节点,在中序遍历中找到G,根据中序遍历的特点可知,G前面的部分为左子树,后面部分为右子树,则可知:
这里写图片描述
然后再看前序遍历,可知D为目前的左子树的根节点,又从中序遍历中可知,A为左子树,EF为右子树:
这里写图片描述
同理可知F为根节点:(为何F为左子树而不是右子树,因为在中序遍历中E在F的前面)
这里写图片描述
对于右子树HMZ同理可以得出:
这里写图片描述

二、哈弗曼编码(可参考:liink)
(情况一)9 4 5 2构建哈夫曼树
1、排序:2 4 5 9
2、挑选出最小的两个数为叶子构造树:
这里写图片描述
3、判断上述计算出的根是否比 5以及9都要大,这里不大,所以找出5、9中小的数继续生长树:
这里写图片描述
4、最后让树继续生长就可以了:
这里写图片描述
权值就是:2*3(树的层数)+4*3+5*2+9*1=37

( 情况二)6 13 18 7 30 16 构建哈夫曼树
1、排序:6 7 13 16 18 30
2、挑选最小的两个数当做叶子节点构建树:
这里写图片描述
2、13小于 16 18 30 所以继续构建树:
这里写图片描述
3、26小于30,继续构建树:
这里写图片描述
4、42大于18和30,分支生长:
这里写图片描述
5、合并:
这里写图片描述
权值就是:6*4+7*4+13*3+16*2+18*2+30*2=219

三、建立初始堆(可参考:link)
一组记录排序码为(5 11 7 2 3 17),则利用堆排序方法建立的初始堆为
1、构建完全二叉树
这里写图片描述
2、原理就是调整a【i】>=a【2*i+1】&&a【i】>=a【2*i+2】(反之也可,就是小根堆):
这里写图片描述

0 0
原创粉丝点击