当前位置:首页 > JavaScript

js实现二叉树

2026-01-14 13:53:32JavaScript

二叉树的基本概念

二叉树是一种树形数据结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树的常见操作包括插入、删除、遍历等。

二叉树的节点定义

在JavaScript中,二叉树的节点可以通过对象或类来定义。每个节点包含数据、左子节点和右子节点的引用。

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

二叉树的插入

插入操作需要根据二叉树的规则(如二叉搜索树的性质)将新节点放置在正确的位置。

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

  insert(value) {
    const newNode = new TreeNode(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);
      }
    }
  }
}

二叉树的遍历

二叉树的遍历方式包括前序遍历、中序遍历和后序遍历。

class BinaryTree {
  // ... 其他方法

  // 前序遍历
  preOrderTraversal(node = this.root) {
    if (node !== null) {
      console.log(node.value);
      this.preOrderTraversal(node.left);
      this.preOrderTraversal(node.right);
    }
  }

  // 中序遍历
  inOrderTraversal(node = this.root) {
    if (node !== null) {
      this.inOrderTraversal(node.left);
      console.log(node.value);
      this.inOrderTraversal(node.right);
    }
  }

  // 后序遍历
  postOrderTraversal(node = this.root) {
    if (node !== null) {
      this.postOrderTraversal(node.left);
      this.postOrderTraversal(node.right);
      console.log(node.value);
    }
  }
}

二叉树的查找

查找操作根据二叉树的规则(如二叉搜索树的性质)判断节点是否存在。

class BinaryTree {
  // ... 其他方法

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

二叉树的删除

删除操作需要处理三种情况:节点无子节点、节点有一个子节点、节点有两个子节点。

class BinaryTree {
  // ... 其他方法

  delete(value) {
    this.root = this._deleteNode(this.root, value);
  }

  _deleteNode(node, value) {
    if (node === null) {
      return null;
    }
    if (value < node.value) {
      node.left = this._deleteNode(node.left, value);
    } else if (value > node.value) {
      node.right = this._deleteNode(node.right, value);
    } else {
      if (node.left === null && node.right === null) {
        return null;
      }
      if (node.left === null) {
        return node.right;
      }
      if (node.right === null) {
        return node.left;
      }
      const minRight = this._findMinNode(node.right);
      node.value = minRight.value;
      node.right = this._deleteNode(node.right, minRight.value);
    }
    return node;
  }

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

示例用法

以下是一个简单的示例,展示如何使用上述代码创建和操作二叉树。

const tree = new BinaryTree();
tree.insert(10);
tree.insert(5);
tree.insert(15);
tree.insert(3);
tree.insert(7);

console.log("前序遍历:");
tree.preOrderTraversal();

console.log("中序遍历:");
tree.inOrderTraversal();

console.log("后序遍历:");
tree.postOrderTraversal();

console.log("查找7:", tree.search(7));
console.log("查找20:", tree.search(20));

tree.delete(5);
console.log("删除5后的中序遍历:");
tree.inOrderTraversal();

js实现二叉树

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

相关文章

js实现轮播

js实现轮播

实现基础轮播效果 使用HTML结构创建轮播容器和图片元素: <div class="carousel"> <div class="carousel-inner">…

js实现倒计时

js实现倒计时

使用 setInterval 实现倒计时 通过 setInterval 定时器每秒更新剩余时间,适用于简单倒计时场景。 function countdown(seconds, callbac…

js实现全选

js实现全选

实现全选功能的方法 在JavaScript中实现全选功能通常涉及监听全选复选框的点击事件,并根据其状态控制其他复选框的选中状态。以下是几种常见的实现方式: 基础DOM操作实现 通过获取所有目标复选…

js实现类

js实现类

JavaScript 实现类的几种方式 JavaScript 是一种基于原型的语言,但在 ES6 之后引入了 class 语法糖,使得实现类更加直观。以下是几种常见的实现方式: 使用构造函数 传统…

js实现pdf在线预览

js实现pdf在线预览

使用PDF.js实现PDF在线预览 PDF.js是由Mozilla开发的一个开源JavaScript库,可以在网页中直接渲染PDF文件。以下是实现PDF在线预览的步骤: 引入PDF.js库 在HT…

js实现拷贝

js实现拷贝

实现文本拷贝 使用 document.execCommand 方法(已废弃但兼容性较好): function copyText(text) { const textarea = document…