当前位置:首页 > JavaScript

排序二叉树js实现

2026-03-02 03:20:41JavaScript

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

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

排序二叉树js实现

节点类定义

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

排序二叉树js实现

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;
  }
}

遍历方法

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

// 中序遍历(升序)
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创建一个基础计算器需要处理数字输入、运算符逻辑和结果显示。以下是一个简单的实现示例: let currentInput = '0'; let previo…

js如何实现继承

js如何实现继承

原型链继承 通过将子类的原型指向父类的实例实现继承。子类实例能够访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Paren…

原生js实现轮播图

原生js实现轮播图

基本结构搭建 HTML部分需要包含轮播图容器、图片列表及导航按钮。结构示例如下: <div class="slider-container"> <div class="slid…

js 实现分页

js 实现分页

实现分页的基本逻辑 分页功能通常需要后端返回数据总量或总页数,前端根据当前页码和每页条数截取对应数据。以下是一个基于JavaScript的简单分页实现方案: 前端分页实现 假设已有从后端获取的完整…

js实现防洪

js实现防洪

防抖(Debounce)实现 防抖的核心思想是在事件触发后延迟执行回调函数,若在延迟时间内再次触发事件,则重新计时。适用于输入框搜索、窗口调整等场景。 function debounce(f…

链表实现js

链表实现js

链表的基本概念 链表是一种线性数据结构,由一系列节点组成,每个节点包含数据和一个指向下一个节点的指针(单向链表)或两个指针(双向链表)。与数组不同,链表在内存中非连续存储,插入和删除操作更高效,但随机…