返回

掌握 AVL 树旋转,平衡二叉树支棱起来!

前端

AVL 树旋转,平衡二叉树的支柱

平衡二叉树,顾名思义,是一种左右子树高度差不会超过 1 的二叉查找树。作为平衡二叉树家族中的一员,AVL 树以其独特的旋转操作而著称。旋转操作巧妙地调整树的结构,确保高度平衡。

AVL 树旋转有四种类型:左旋、右旋、左双旋和右双旋。这些旋转操作以特定的方式调整树的节点,从而恢复树的高度平衡。掌握旋转操作是理解和实现 AVL 树的关键。

JavaScript 实现 AVL 树

在 JavaScript 中实现 AVL 树并不困难。以下是如何进行旋转操作:

class AVLNode {
  constructor(key, value) {
    this.key = key;
    this.value = value;
    this.left = null;
    this.right = null;
    this.height = 0;
  }
}

class AVLTree {
  constructor() {
    this.root = null;
  }

  // 左旋
  leftRotate(node) {
    const rightChild = node.right;
    node.right = rightChild.left;
    rightChild.left = node;

    node.height = Math.max(this.getHeight(node.left), this.getHeight(node.right)) + 1;
    rightChild.height = Math.max(this.getHeight(rightChild.left), this.getHeight(rightChild.right)) + 1;

    return rightChild;
  }

  // 右旋
  rightRotate(node) {
    const leftChild = node.left;
    node.left = leftChild.right;
    leftChild.right = node;

    node.height = Math.max(this.getHeight(node.left), this.getHeight(node.right)) + 1;
    leftChild.height = Math.max(this.getHeight(leftChild.left), this.getHeight(leftChild.right)) + 1;

    return leftChild;
  }

  // 左双旋
  leftDoubleRotate(node) {
    node.left = this.rightRotate(node.left);
    return this.leftRotate(node);
  }

  // 右双旋
  rightDoubleRotate(node) {
    node.right = this.leftRotate(node.right);
    return this.rightRotate(node);
  }
}

结语

AVL 树旋转是平衡二叉树的重要操作。掌握旋转操作可以帮助你理解和实现 AVL 树,进而解决更复杂的平衡问题。如果你想深入了解平衡二叉树的世界,AVL 树旋转是一个必不可少的起点。希望这篇文章能为你提供一个坚实的基础,让你踏上平衡二叉树的探索之旅。