什么是堆?
堆是按照一定顺序组织的完全二叉树
优先队列:特殊的“队列”,取出元素的顺序是依照元素的优先权(关键字)大小,
而不是元素进入队列的先后顺序。
是否可以采用二叉树存储结构?可以,查找与删除的时间复杂度均为以2为底n的对数即log(2)n
二叉搜索树?
如果采用二叉树结构,应更关注插入还是删除?(删除)
树结点顺序怎么安排?
树结构怎样?
堆的两个特性:
结构性:用数组表示的完全二叉树
有序性:任意结点的关键字是其子树所有结点的最大值(或最小值)
“最大堆”也称“大顶堆”:最大值
“最小堆”也称“小顶堆”:最小值
堆中任一路径上的元素都是有序的
堆的应用“:堆排序
在堆删除操作中一个主要问题是 已知左边是个堆,右边是个堆,插入一个新元素,二叉树中元素该如何动
如何根据结点不同的查找频率构造更有效的搜索树?
带权路径长度(WPL):设二叉树有n个叶子结点,每个叶子结点带有权值W(k),从根节点到每个叶子结点的长度为l(k),则每个叶子结点的带权路径长度之和就是
哈夫曼树(也称最优二叉树)的定义:WPL最小的二叉树
哈夫曼树的特点
没有度为1的结点
N个叶子结点的哈夫曼树共有2n-1个结点
哈夫曼树的任意非叶节点的左右子树交换后仍是哈夫曼树
二叉树用于编码:
用二叉树进行编码
- 左右分支:0,1
- 字符只在叶节点上
对同一组权值{w1,w2,….,wn}是否存在不同构的两棵哈夫曼树呢?存在,比如
哈夫曼树的构造:
每次把权值最小的两棵二叉树合并,