当前位置:首页 > JavaScript

排序二叉树js实现

2026-04-05 04:12:36JavaScript

排序二叉树js实现

排序二叉树js实现

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

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

节点类定义

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实现文件下载

js实现文件下载

使用 a 标签下载文件 通过动态创建 a 标签并设置 download 属性实现文件下载。适用于已知文件 URL 或 Blob 数据的情况。 function downloadFile(url, f…

js 实现链表

js 实现链表

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

js实现密码

js实现密码

密码强度验证 使用正则表达式验证密码强度是一种常见方法。以下代码检查密码是否包含大小写字母、数字和特殊字符,且长度至少为8位: function checkPasswordStrength(pass…

js 实现滚动

js 实现滚动

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

js 实现图片轮播

js 实现图片轮播

基础实现方案 使用HTML、CSS和JavaScript创建一个简单的图片轮播。HTML部分定义轮播容器和图片,CSS负责样式布局,JavaScript处理轮播逻辑。 <div class="…

js 多选 实现

js 多选 实现

实现多选的 JavaScript 方法 使用复选框(Checkbox)实现多选 通过 HTML 的 checkbox 元素配合 JavaScript 实现多选功能。用户可以选择多个选项,提交时获取所有…