当前位置:首页 > JavaScript

排序二叉树js实现

2026-01-31 12:04:43JavaScript

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

排序二叉树(Binary Search Tree, BST)是一种数据结构,满足以下性质:

排序二叉树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;
    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;
  let found = false;
  while (current && !found) {
    if (value < current.value) {
      current = current.left;
    } else if (value > current.value) {
      current = current.right;
    } else {
      found = true;
    }
  }

  return found ? current : undefined;
}

删除节点方法

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 {
      // 情况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:有两个子节点
      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);
}

遍历方法

中序遍历(升序)

排序二叉树js实现

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);
bst.insert(5);
bst.insert(15);
bst.insert(2);
bst.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)。

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

相关文章

jquery.js

jquery.js

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

js实现

js实现

实现 JavaScript 功能的方法 在 JavaScript 中实现特定功能通常涉及多个步骤。以下是常见的实现方法: 基础语法和变量声明 使用 let 或 const 声明变量: let co…

js实现验证码

js实现验证码

使用Canvas生成图形验证码 在HTML中创建一个Canvas元素用于绘制验证码。通过JavaScript随机生成数字或字母组合,并添加干扰线、噪点等干扰元素增强安全性。 <canvas i…

js实现乘

js实现乘

JavaScript 实现乘法运算 在 JavaScript 中实现乘法运算可以通过多种方式完成,包括基本运算符、函数封装以及高级算法(如大数乘法)。以下是几种常见方法: 使用基本乘法运算符 Jav…

js实现列表

js实现列表

使用 JavaScript 实现列表 JavaScript 提供了多种方式来实现列表功能,包括数组操作、DOM 元素动态生成等。以下是几种常见的实现方法: 使用数组存储列表数据 数组是 JavaSc…

js 实现链表

js 实现链表

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