数据结构-二叉树、堆

完全二叉树

在一颗二叉树中,若除最后一层外的其余层都是满的,并且最后一层要么是满的(满二叉树),要么在右边缺少连续若干节点,则此二叉树为完全二叉树(Complete Binary Tree)

2个充要条件:

  • 堆中所有结点的值必须大于或等于(或小于或等于)其孩子结点的值。(最大堆:堆顶最大。最小堆:堆顶最小)
  • 必须是完全二叉树。

插入 - 向堆中添加元素和Sift Up

当插入一个元素到堆中时,如果不满足堆的性质,调整堆中元素的位置使之重新变成堆,这个过程称为堆化(heapifying);
思想:在最大堆中,要堆化一个元素,需要找到它的父亲结点,如果不满足堆的基本性质则交换两个元素的位置,重复该过程直到每个结点都满足堆的性质为止
时间复杂度为:O(log2(n))

删除最大 - 取出堆中的最大元素和Sift Down

思想:删顶元素,最后的元素顶上。 然后就可以按上面插入的逻辑来理解了。
时间复杂度为:O(log2(n))

创建堆

做法:
1,一个个插入。(次方案,时间复杂度 n*O(log2(n)) )
2,最大堆有一个特点就是其各个子树都是一个最大堆,那么我们就可以从把最小子树转换成一个最大堆,然后依次转换它的父节点对应的子树,直到最后的根节点所在的整个完全二叉树变成最大堆。那么从哪一个子树开始调整?
我们从该完全二叉树中的最后一个非叶子节点为根节点的子树进行调整,然后依次去找倒数第二个倒数第三个非叶子节点...

Ref:

最大堆(创建、删除、插入和堆排序) -- 只看堆创建部分。

原文地址:https://www.cnblogs.com/Jaysonhome/p/13619956.html