当前位置:首页 > JavaScript

js实现平衡二叉树

2026-01-31 11:53:38JavaScript

平衡二叉树的实现

平衡二叉树(AVL树)是一种自平衡二叉搜索树,确保树的高度差不超过1。在JavaScript中,可以通过类结构实现AVL树,包括节点插入、删除和平衡操作。

定义节点类

每个节点包含值、左子树、右子树和高度属性。

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

定义AVL树类

AVL树类需要实现插入、删除和平衡方法。

js实现平衡二叉树

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

    // 获取节点高度
    getHeight(node) {
        return node ? node.height : 0;
    }

    // 更新节点高度
    updateHeight(node) {
        node.height = Math.max(this.getHeight(node.left), this.getHeight(node.right)) + 1;
    }

    // 计算平衡因子
    getBalanceFactor(node) {
        return this.getHeight(node.left) - this.getHeight(node.right);
    }
}

旋转操作

AVL树通过旋转操作保持平衡,包括左旋和右旋。

右旋操作:

js实现平衡二叉树

rightRotate(y) {
    const x = y.left;
    const T2 = x.right;

    x.right = y;
    y.left = T2;

    this.updateHeight(y);
    this.updateHeight(x);

    return x;
}

左旋操作:

leftRotate(x) {
    const y = x.right;
    const T2 = y.left;

    y.left = x;
    x.right = T2;

    this.updateHeight(x);
    this.updateHeight(y);

    return y;
}

插入节点

插入节点后检查平衡并进行旋转。

insert(value) {
    this.root = this._insert(this.root, value);
}

_insert(node, value) {
    if (!node) return new AVLNode(value);

    if (value < node.value) {
        node.left = this._insert(node.left, value);
    } else if (value > node.value) {
        node.right = this._insert(node.right, value);
    } else {
        return node; // 不允许重复值
    }

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

    // 左左情况
    if (balance > 1 && value < node.left.value) {
        return this.rightRotate(node);
    }

    // 右右情况
    if (balance < -1 && value > node.right.value) {
        return this.leftRotate(node);
    }

    // 左右情况
    if (balance > 1 && value > node.left.value) {
        node.left = this.leftRotate(node.left);
        return this.rightRotate(node);
    }

    // 右左情况
    if (balance < -1 && value < node.right.value) {
        node.right = this.rightRotate(node.right);
        return this.leftRotate(node);
    }

    return node;
}

删除节点

删除节点后同样需要检查平衡。

delete(value) {
    this.root = this._delete(this.root, value);
}

_delete(node, value) {
    if (!node) return null;

    if (value < node.value) {
        node.left = this._delete(node.left, value);
    } else if (value > node.value) {
        node.right = this._delete(node.right, value);
    } else {
        if (!node.left || !node.right) {
            node = node.left || node.right;
        } else {
            const minRight = this.findMin(node.right);
            node.value = minRight.value;
            node.right = this._delete(node.right, minRight.value);
        }
    }

    if (!node) return null;

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

    // 左左情况
    if (balance > 1 && this.getBalanceFactor(node.left) >= 0) {
        return this.rightRotate(node);
    }

    // 左右情况
    if (balance > 1 && this.getBalanceFactor(node.left) < 0) {
        node.left = this.leftRotate(node.left);
        return this.rightRotate(node);
    }

    // 右右情况
    if (balance < -1 && this.getBalanceFactor(node.right) <= 0) {
        return this.leftRotate(node);
    }

    // 右左情况
    if (balance < -1 && this.getBalanceFactor(node.right) > 0) {
        node.right = this.rightRotate(node.right);
        return this.leftRotate(node);
    }

    return node;
}

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

使用示例

const avlTree = new AVLTree();
avlTree.insert(10);
avlTree.insert(20);
avlTree.insert(30);
avlTree.insert(40);
avlTree.insert(50);
avlTree.insert(25);

avlTree.delete(40);

通过以上实现,可以构建一个功能完整的AVL树,支持动态插入和删除操作,同时自动维护树的平衡性。

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

相关文章

js实现图片轮播

js实现图片轮播

实现基础图片轮播 使用HTML、CSS和JavaScript创建一个简单的图片轮播。HTML部分定义轮播容器和图片,CSS设置样式和动画效果,JavaScript处理轮播逻辑。 <div cl…

js实现图片预览

js实现图片预览

使用FileReader API实现图片预览 通过FileReader对象读取用户选择的图片文件并显示预览: const input = document.getElementById('image…

js实现抽奖

js实现抽奖

实现抽奖功能的基本思路 抽奖功能的核心是随机选择奖项并展示结果。可以通过数组存储奖项,利用随机数生成索引,最后通过动画增强用户体验。 准备奖项数据 定义一个数组存储奖项信息,每个奖项可以包含名称、图…

js实现选题

js实现选题

实现选题功能的JavaScript方法 基础实现方案 使用数组存储选项,通过随机索引选取: const options = ['选项A', '选项B', '选项C', '选项D']; const r…

js实现路由

js实现路由

js实现路由的方法 在JavaScript中实现路由功能可以通过多种方式完成,以下是几种常见的方法: 使用原生JavaScript实现路由 通过监听window.onhashchange事件来实现基…

js 实现滚动

js 实现滚动

实现滚动的方法 使用 window.scrollTo() window.scrollTo() 方法可以滚动到文档中的特定位置。可以指定 x 和 y 坐标,或者使用平滑滚动的选项。 // 滚动到指定位…