堆和二叉树的关系

132 阅读1分钟

JS 执行时代码中的变量

  • 值类型 - 存储到栈
  • 引用类型 - 存储到堆

堆栈内存.png

堆的特点:

  • 节点的值,总是不大于(或不小于)其父节点的值
  • 完全二叉树

完全二叉树.png

堆,虽然逻辑上是二叉树,但实际上它使用数组来存储的。

堆.webp

// 上图是一个堆(从小到大),可以用数组表示
const heap = [-1, 10, 14, 25, 33, 81, 82, 99] // 忽略 0 节点

// 节点关系
const parentIndex = Math.floor(i / 2)
const leftIndex = 2 * i
const rightIndex = 2 * i + 1

堆的排序规则,没有 BST 那么严格,这就造成了

  • 查询比 BST 慢
  • 增删比 BST 快,维持平衡也更快
  • 但整体复杂度都是 O(logn) 级别,即树的高度

但结合堆的应用场景

  • 一般使用内存地址(栈中保存了)来查询,不会直接从根节点搜索
  • 堆的物理结构是数组,所以查询复杂度就是 O(1)

总结

  • 物理结构是数组(空间更小),逻辑结构是二叉树(操作更快)
  • 适用于“堆栈”结构