当前位置:首页 > JavaScript

排序二叉树js实现

2026-03-02 03:20:41JavaScript

排序二叉树(BST)的 JavaScript 实现

排序二叉树(Binary Search Tree,BST)是一种特殊的二叉树,其中每个节点的左子树节点值小于当前节点值,右子树节点值大于当前节点值。以下是 JavaScript 的实现方法:

节点类定义

每个节点包含值、左子节点和右子节点的引用:

class Node {
  constructor(value) {
    this.value = value;
    this.left = null;
    this.right = null;
  }
}

二叉搜索树类

实现插入、查找、删除等核心操作:

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

  // 插入节点
  insert(value) {
    const newNode = new Node(value);
    if (this.root === null) {
      this.root = newNode;
    } else {
      this._insertNode(this.root, newNode);
    }
  }

  _insertNode(node, newNode) {
    if (newNode.value < node.value) {
      if (node.left === null) {
        node.left = newNode;
      } else {
        this._insertNode(node.left, newNode);
      }
    } else {
      if (node.right === null) {
        node.right = newNode;
      } else {
        this._insertNode(node.right, newNode);
      }
    }
  }

  // 查找节点
  search(value) {
    return this._searchNode(this.root, value);
  }

  _searchNode(node, value) {
    if (node === null) return false;
    if (value < node.value) {
      return this._searchNode(node.left, value);
    } else if (value > node.value) {
      return this._searchNode(node.right, value);
    } else {
      return true;
    }
  }

  // 删除节点
  remove(value) {
    this.root = this._removeNode(this.root, value);
  }

  _removeNode(node, value) {
    if (node === null) return null;
    if (value < node.value) {
      node.left = this._removeNode(node.left, value);
      return node;
    } else if (value > node.value) {
      node.right = this._removeNode(node.right, value);
      return node;
    } else {
      // 情况1:叶子节点
      if (node.left === null && node.right === null) {
        return null;
      }
      // 情况2:只有一个子节点
      if (node.left === null) {
        return node.right;
      }
      if (node.right === null) {
        return node.left;
      }
      // 情况3:有两个子节点
      const minRight = this._findMinNode(node.right);
      node.value = minRight.value;
      node.right = this._removeNode(node.right, minRight.value);
      return node;
    }
  }

  _findMinNode(node) {
    while (node && node.left !== null) {
      node = node.left;
    }
    return node;
  }
}

遍历方法

实现前序、中序、后序遍历:

排序二叉树js实现

// 中序遍历(升序)
inOrderTraverse(callback) {
  this._inOrderTraverseNode(this.root, callback);
}

_inOrderTraverseNode(node, callback) {
  if (node !== null) {
    this._inOrderTraverseNode(node.left, callback);
    callback(node.value);
    this._inOrderTraverseNode(node.right, callback);
  }
}

// 前序遍历
preOrderTraverse(callback) {
  this._preOrderTraverseNode(this.root, callback);
}

_preOrderTraverseNode(node, callback) {
  if (node !== null) {
    callback(node.value);
    this._preOrderTraverseNode(node.left, callback);
    this._preOrderTraverseNode(node.right, callback);
  }
}

// 后序遍历
postOrderTraverse(callback) {
  this._postOrderTraverseNode(this.root, callback);
}

_postOrderTraverseNode(node, callback) {
  if (node !== null) {
    this._postOrderTraverseNode(node.left, callback);
    this._postOrderTraverseNode(node.right, callback);
    callback(node.value);
  }
}

使用示例

const bst = new BinarySearchTree();
bst.insert(11);
bst.insert(7);
bst.insert(15);
bst.insert(5);
bst.insert(3);

bst.inOrderTraverse(value => console.log(value)); // 输出:3,5,7,11,15
console.log(bst.search(7)); // true
bst.remove(5);

注意事项

  • 插入重复值的处理需根据需求决定(示例中默认插入右子树)
  • 删除操作需处理三种情况:叶子节点、单子节点、双子节点
  • 时间复杂度:平均情况下插入/查找/删除为 O(log n),最坏情况(退化为链表)为 O(n)

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

相关文章

js实现验证

js实现验证

验证表单输入 使用JavaScript验证表单输入是常见的需求。可以通过监听表单提交事件,检查输入字段是否符合要求。 document.getElementById('myForm').addEve…

js实现换肤

js实现换肤

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

js jquery

js jquery

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画设计和 Ajax 交互。它兼容多种浏览器,提供易于使用的 API,使开发者能够…

js手势实现

js手势实现

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

js实现vue路由

js实现vue路由

Vue 路由的基本实现 在 Vue.js 中实现路由功能通常使用 Vue Router 库。Vue Router 是 Vue.js 官方的路由管理器,用于构建单页面应用(SPA)。 安装 Vue R…

节流js实现

节流js实现

节流(Throttle)的实现原理 节流是一种限制函数执行频率的技术,确保函数在一定时间间隔内最多执行一次。适用于高频触发事件(如滚动、输入、窗口调整等)的场景。 基础实现方式 使用时间戳判断是否执…