二叉树-堆

  • 2019 年 12 月 31 日
  • 筆記

二叉树:满二叉树、完全二叉树

满二叉树:叶子节点都在最底层,除了叶子节点,其他节点都有左右两个子节点;

完全二叉树:叶子节点都在最底下两层,最后一层的叶子节点都靠左排列,并且除了最后一层,其他层的节点个数都要达到最大;

  • 完全二叉树
  • 堆的每个节点都大于等于(或者小于等于)其子树的中的每个节点
  • 每个节点都大于等于其子树的节点,叫大顶堆,即顶点为树中最大值
  • 每个节点都小于等于其子树的节点,叫小顶堆,即顶点为树中最小值

堆的插入(最大堆)

  • 按照二叉树的顺序,插入新元素
  • 新插入的元素,需要与父节点比较,如果大于父节点,则和父节点交换
  • 依次与父节点比较,满足则完成,否则继续交换到根
  • 时间复杂度为 logN

堆的删除(最大堆)

  • 删除都是移除根元素,然后为了继续满足完全二叉树的特性,需要将最后一个元素替换到根元素位置
  • 然后,从顶向下,做交换操作,直到满足堆的特性,即父节点为子树的最大值

Java的实现:PriorityQueue

# 父index 找 子index:  左子:2 * index + 1  右子:2 * index + 2  # 子index 找 父 index:  数学运算:(index-1) / 2  位运算:(index-1) >>> 2

插入

删除

扩展

>>>与>>区别?  >>>为无符号右移  无论正负,高位都补0,  >>为右移  正数的话,高位补0  负数的话,高位补1    7 >>> 1  7 >> 1  -7 >>> 1  -7 >> 1