数组实现的二叉树,一般实现完全二叉树,一般二叉树不建议使用,根节点下表从 【1】开始

性质

可由数组表示,位置k的节点的父节点位置为[k/2],而它的两个子节点的位置则分别为2k和2k+1
image.png
image.png

上浮

对一个元素进行上浮,直到到达顶部

  1. function swim(k) {
  2. while(k > 1 && less(parseInt(k / 2), k)) {
  3. exch(parseInt(k / 2), k);
  4. k = parseInt(k / 2);
  5. }
  6. }

下沉

  1. // N 为数组长度
  2. function sink(k) {
  3. while(2 * k <= N) {
  4. let j = 2 * k;
  5. if (j < N && less(j, j + 1)) j++;
  6. if(!less(k, j)) break;
  7. exch(k, j);
  8. k = j;
  9. }
  10. }

插入元素

在底部插入元素,并且上浮到合理位置
image.png

删除元素

1.将顶部元素与底部元素对换位置
2.pop()出尾部元素
3.下沉
image.png

实现

  1. /*
  2. * @Author : yangte
  3. * @Date : 2020-10-10 23:51:41
  4. * @LastEditTime : 2020-10-11 00:35:19
  5. * @LastEditors : yangte
  6. * @Description : 数据结构-堆
  7. */
  8. class Heap {
  9. constructor() {
  10. this.pq = [null];
  11. this.N = 0;
  12. }
  13. get isEmpty() {
  14. return this.N === 0;
  15. }
  16. get size() {
  17. return this.N;
  18. }
  19. insert(v) {
  20. this.pq[++this.N] = v;
  21. this._swim(this.N);
  22. console.log(this.pq.join(',').slice(1));
  23. }
  24. delMax() {
  25. this._exch(1, N--);
  26. this.pq.pop();
  27. this._sink(1);
  28. }
  29. _less(i, j) {
  30. return this.pq[i] < this.pq[j];
  31. }
  32. _exch(i, j) {
  33. [this.pq[i], this.pq[j]] = [this.pq[j], this.pq[i]];
  34. }
  35. // 上浮
  36. _swim(k) {
  37. while (k > 1) {
  38. // 终止条件:子节点小于父节点
  39. if (this._less(k, Math.floor(k / 2))) break;
  40. this._exch(Math.floor(k / 2), k);
  41. k = Math.floor(k / 2);
  42. }
  43. }
  44. _sink(k) {
  45. while (2 * k <= this.N) {
  46. let j = 2 * k;
  47. // 选择子节点:选择走哪条路,左或者右
  48. if (j < this.N && this._less(j, j + 1)) {
  49. j++;
  50. }
  51. // 终止条件:排序符合正常
  52. if (this._less(j, k)) break;
  53. this._exch(k, j);
  54. k = j;
  55. }
  56. }
  57. }