当前位置:首页 > JavaScript

js实现平衡二叉树

2026-03-02 03:09:29JavaScript

平衡二叉树的概念

平衡二叉树(AVL树)是一种自平衡二叉搜索树,确保任何节点的左右子树高度差不超过1。通过旋转操作(左旋、右旋、左右旋、右左旋)维持平衡,保证查找、插入、删除操作的时间复杂度为O(log n)。

节点结构定义

使用JavaScript类定义AVL树的节点,包含值、左子树、右子树和高度属性:

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

计算节点高度

通过递归获取子树高度,用于平衡因子计算:

function getHeight(node) {
  return node ? node.height : 0;
}

计算平衡因子

平衡因子为左子树高度减去右子树高度,绝对值超过1时需旋转:

function getBalanceFactor(node) {
  return getHeight(node.left) - getHeight(node.right);
}

更新节点高度

插入或删除后更新节点高度,基于子树高度:

js实现平衡二叉树

function updateHeight(node) {
  node.height = Math.max(getHeight(node.left), getHeight(node.right)) + 1;
}

旋转操作

右旋(LL型不平衡)
当左子树高度较高且左子树的左子树导致不平衡:

function rightRotate(y) {
  const x = y.left;
  const T2 = x.right;
  x.right = y;
  y.left = T2;
  updateHeight(y);
  updateHeight(x);
  return x;
}

左旋(RR型不平衡)
当右子树高度较高且右子树的右子树导致不平衡:

function leftRotate(x) {
  const y = x.right;
  const T2 = y.left;
  y.left = x;
  x.right = T2;
  updateHeight(x);
  updateHeight(y);
  return y;
}

左右旋(LR型不平衡)
先对左子树左旋,再对当前节点右旋:

js实现平衡二叉树

function leftRightRotate(node) {
  node.left = leftRotate(node.left);
  return rightRotate(node);
}

右左旋(RL型不平衡)
先对右子树右旋,再对当前节点左旋:

function rightLeftRotate(node) {
  node.right = rightRotate(node.right);
  return leftRotate(node);
}

插入节点

递归插入后检查平衡因子,根据情况旋转:

function insertNode(node, value) {
  if (!node) return new AVLNode(value);
  if (value < node.value) {
    node.left = insertNode(node.left, value);
  } else if (value > node.value) {
    node.right = insertNode(node.right, value);
  } else {
    return node; // 重复值不插入
  }

  updateHeight(node);
  const balance = getBalanceFactor(node);

  // LL型
  if (balance > 1 && value < node.left.value) {
    return rightRotate(node);
  }
  // RR型
  if (balance < -1 && value > node.right.value) {
    return leftRotate(node);
  }
  // LR型
  if (balance > 1 && value > node.left.value) {
    return leftRightRotate(node);
  }
  // RL型
  if (balance < -1 && value < node.right.value) {
    return rightLeftRotate(node);
  }

  return node;
}

删除节点

递归删除后检查平衡,类似插入逻辑:

function deleteNode(node, value) {
  if (!node) return null;
  if (value < node.value) {
    node.left = deleteNode(node.left, value);
  } else if (value > node.value) {
    node.right = deleteNode(node.right, value);
  } else {
    if (!node.left || !node.right) {
      node = node.left || node.right;
    } else {
      const minRight = findMin(node.right);
      node.value = minRight.value;
      node.right = deleteNode(node.right, minRight.value);
    }
  }

  if (!node) return null;
  updateHeight(node);
  const balance = getBalanceFactor(node);

  // LL型
  if (balance > 1 && getBalanceFactor(node.left) >= 0) {
    return rightRotate(node);
  }
  // LR型
  if (balance > 1 && getBalanceFactor(node.left) < 0) {
    return leftRightRotate(node);
  }
  // RR型
  if (balance < -1 && getBalanceFactor(node.right) <= 0) {
    return leftRotate(node);
  }
  // RL型
  if (balance < -1 && getBalanceFactor(node.right) > 0) {
    return rightLeftRotate(node);
  }

  return node;
}

function findMin(node) {
  while (node.left) node = node.left;
  return node;
}

使用示例

let root = null;
root = insertNode(root, 10);
root = insertNode(root, 20);
root = insertNode(root, 30); // 自动触发左旋
root = insertNode(root, 5);
root = deleteNode(root, 20); // 删除后自动平衡

通过上述代码可实现AVL树的基本操作,确保动态维护平衡性。

标签: 二叉树js
分享给朋友:

相关文章

jquery.js

jquery.js

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,用于简化 HTML 文档遍历、事件处理、动画设计和 Ajax 交互。它的设计宗旨是“Write Less, Do Mor…

js实现跳转

js实现跳转

使用 window.location 跳转 通过修改 window.location.href 实现页面跳转,这是最常用的方法。 window.location.href = 'https://…

js实现打印

js实现打印

使用window.print()方法实现打印 在JavaScript中,可以通过调用window.print()方法直接触发浏览器的打印功能。这会打开系统的打印对话框,用户可以选择打印机和设置打印选项…

js实现换肤

js实现换肤

使用CSS变量实现换肤 通过CSS变量可以轻松实现主题切换功能。CSS变量在根元素中定义,通过JavaScript动态修改这些变量值。 :root { --primary-color: #349…

js手势实现

js手势实现

手势识别实现方法 在JavaScript中实现手势识别通常涉及监听触摸事件(touchstart、touchmove、touchend)或鼠标事件(mousedown、mousemove、mouseu…

使用js实现

使用js实现

使用JavaScript实现 JavaScript可以通过Math.random()函数生成随机数,结合其他方法可以实现多种随机数生成需求。 // 生成0到1之间的随机小数 const rando…