当前位置:首页 > JavaScript

排序二叉树js实现

2026-04-05 04:12:36JavaScript

排序二叉树(二叉搜索树)的 JavaScript 实现

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

排序二叉树js实现

节点类定义

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

二叉搜索树类框架

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

插入节点

insert(value) {
  const newNode = new TreeNode(value);
  if (this.root === null) {
    this.root = newNode;
    return this;
  }

  let current = this.root;
  while (true) {
    if (value === current.value) return undefined;

    if (value < current.value) {
      if (current.left === null) {
        current.left = newNode;
        return this;
      }
      current = current.left;
    } else {
      if (current.right === null) {
        current.right = newNode;
        return this;
      }
      current = current.right;
    }
  }
}

查找节点

find(value) {
  if (this.root === null) return false;

  let current = this.root;
  while (current) {
    if (value === current.value) return current;

    if (value < current.value) {
      current = current.left;
    } else {
      current = current.right;
    }
  }
  return false;
}

删除节点

delete(value) {
  const deleteNode = (node, value) => {
    if (node === null) return null;

    if (value < node.value) {
      node.left = deleteNode(node.left, value);
      return node;
    } else if (value > node.value) {
      node.right = deleteNode(node.right, value);
      return node;
    } else {
      if (node.left === null) return node.right;
      if (node.right === null) return node.left;

      let tempNode = node.right;
      while (tempNode.left !== null) {
        tempNode = tempNode.left;
      }
      node.value = tempNode.value;
      node.right = deleteNode(node.right, tempNode.value);
      return node;
    }
  };

  this.root = deleteNode(this.root, value);
}

遍历方法

// 中序遍历(升序)
inOrder() {
  const result = [];
  const traverse = (node) => {
    if (node.left) traverse(node.left);
    result.push(node.value);
    if (node.right) traverse(node.right);
  };
  traverse(this.root);
  return result;
}

// 前序遍历
preOrder() {
  const result = [];
  const traverse = (node) => {
    result.push(node.value);
    if (node.left) traverse(node.left);
    if (node.right) traverse(node.right);
  };
  traverse(this.root);
  return result;
}

// 后序遍历
postOrder() {
  const result = [];
  const traverse = (node) => {
    if (node.left) traverse(node.left);
    if (node.right) traverse(node.right);
    result.push(node.value);
  };
  traverse(this.root);
  return result;
}

使用示例

const bst = new BinarySearchTree();
bst.insert(10).insert(5).insert(15).insert(2).insert(7);

console.log(bst.inOrder()); // [2, 5, 7, 10, 15]
bst.delete(5);
console.log(bst.inOrder()); // [2, 7, 10, 15]

复杂度分析

  • 插入/查找/删除操作的平均时间复杂度为 O(log n)
  • 最坏情况(树退化为链表)时间复杂度为 O(n)
  • 空间复杂度为 O(n)

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

相关文章

js实现vue

js实现vue

Vue.js 简介 Vue.js 是一个渐进式 JavaScript 框架,用于构建用户界面。其核心库专注于视图层,易于与其他库或现有项目整合。 实现 Vue.js 的基本步骤 安装 Vue.j…

js实现跳转

js实现跳转

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

js 实现链表

js 实现链表

链表的基本概念 链表是一种线性数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。与数组不同,链表在内存中是非连续存储的,插入和删除操作效率较高。 链表的实现 在 JavaScrip…

js实现点击显示和隐藏

js实现点击显示和隐藏

实现点击显示和隐藏的JavaScript方法 使用classList.toggle切换类名 通过添加/移除CSS类控制元素的显示与隐藏,需提前在CSS中定义隐藏样式(如display: none)。…

js实现dh

js实现dh

JavaScript 实现 DH(Diffie-Hellman)密钥交换 Diffie-Hellman(DH)密钥交换是一种安全协议,允许双方在不安全的通信信道上建立一个共享密钥。以下是如何在 Jav…

js实现防洪

js实现防洪

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