当前位置:首页 > JavaScript

js实现二叉树

2026-01-14 13:53:32JavaScript

二叉树的基本概念

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

二叉树的节点定义

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

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

二叉树的插入

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

js实现二叉树

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

二叉树的查找

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

js实现二叉树

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实现vue

js实现vue

Vue.js 的基本实现方法 在 JavaScript 中实现 Vue.js 的功能,可以通过直接引入 Vue 库或使用现代构建工具(如 Vite 或 Webpack)。以下是几种常见的实现方式:…

js实现打印

js实现打印

使用window.print()方法实现打印 在JavaScript中,可以通过调用window.print()方法直接触发浏览器的打印功能。这会打开系统的打印对话框,用户可以选择打印机和设置打印选项…

链表实现js

链表实现js

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

js实现吸色

js实现吸色

使用Canvas实现吸色功能 通过Canvas的getImageData方法获取像素颜色数据。创建一个Canvas元素,将目标图像绘制到Canvas上,通过鼠标事件获取坐标对应的颜色值。 c…

js实现视口

js实现视口

js实现视口检测的方法 使用JavaScript检测元素是否进入视口(viewport)可以通过Intersection Observer API或手动计算元素位置实现。以下是两种常见方法: Int…

js分页实现

js分页实现

分页的基本原理 分页的核心是通过计算当前页码和数据偏移量,从服务器或本地数据中截取对应范围的数据进行展示。通常需要以下参数:当前页码(currentPage)、每页条数(pageSize)、总数据量(…