📜  Javascript中二叉搜索树的实现(1)

📅  最后修改于: 2023-12-03 15:01:47.381000             🧑  作者: Mango

Javascript中二叉搜索树的实现

二叉搜索树(Binary Search Tree,简称BST)是一种常用的数据结构,它能够高效地进行检索、插入和删除操作。在Javascript中,我们可以使用对象(Object)来实现二叉搜索树。

什么是二叉搜索树

二叉搜索树是一种有序的二叉树,其中每个节点都包含一个键值。对于每个节点,其左子树中的所有键值小于该节点的键值,其右子树中的所有键值大于该节点的键值。这个特性使得二叉搜索树可以高效地进行搜索。

二叉搜索树的实现
节点结构

首先,我们需要定义二叉搜索树的节点结构。每个节点包含一个键值和两个指针,分别指向左子节点和右子节点。我们可以使用一个对象来表示节点结构,如下所示的代码片段:

class Node {
  constructor(key) {
    this.key = key;
    this.left = null;
    this.right = null;
  }
}
二叉搜索树类

我们将使用一个类来表示二叉搜索树,这个类包含一系列方法来实现对二叉搜索树的操作。下面是一个简单的二叉搜索树类的代码片段:

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

  // 向树中插入一个节点
  insert(key) {
    const newNode = new Node(key);

    if (this.root === null) {
      this.root = newNode;
    } else {
      this.insertNode(this.root, newNode);
    }
  }

  // 递归插入节点的辅助函数
  insertNode(node, newNode) {
    if (newNode.key < node.key) {
      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);
      }
    }
  }

  // 在树中查找指定的键值,并返回对应的节点
  search(key) {
    return this.searchNode(this.root, key);
  }

  // 递归搜索节点的辅助函数
  searchNode(node, key) {
    if (node === null) {
      return null;
    } else if (key < node.key) {
      return this.searchNode(node.left, key);
    } else if (key > node.key) {
      return this.searchNode(node.right, key);
    } else {
      return node;
    }
  }

  // 中序遍历树中的所有节点
  inorderTraversal() {
    const result = [];
    this.inorderTraversalNode(this.root, (node) => {
      result.push(node.key);
    });
    return result;
  }

  // 递归中序遍历节点的辅助函数
  inorderTraversalNode(node, callback) {
    if (node !== null) {
      this.inorderTraversalNode(node.left, callback);
      callback(node);
      this.inorderTraversalNode(node.right, callback);
    }
  }

  // 删除树中的指定节点
  remove(key) {
    this.root = this.removeNode(this.root, key);
  }

  // 递归删除节点的辅助函数
  removeNode(node, key) {
    if (node === null) {
      return null;
    } else if (key < node.key) {
      node.left = this.removeNode(node.left, key);
      return node;
    } else if (key > node.key) {
      node.right = this.removeNode(node.right, key);
      return node;
    } else {
      if (node.left === null && node.right === null) {
        node = null;
        return node;
      }

      if (node.left === null) {
        node = node.right;
        return node;
      } else if (node.right === null) {
        node = node.left;
        return node;
      }

      const minNode = this.findMinNode(node.right);
      node.key = minNode.key;
      node.right = this.removeNode(node.right, minNode.key);
      return node;
    }
  }

  // 查找树中的最小节点
  findMinNode(node) {
    if (node.left === null) {
      return node;
    } else {
      return this.findMinNode(node.left);
    }
  }
}
使用示例

下面是一个使用二叉搜索树的示例代码:

const bst = new BinarySearchTree();

// 向树中插入节点
bst.insert(8);
bst.insert(3);
bst.insert(10);
bst.insert(1);
bst.insert(6);
bst.insert(14);
bst.insert(4);
bst.insert(7);
bst.insert(13);

// 搜索节点
const result = bst.search(6);
console.log(result.key); // 输出 6

// 中序遍历树
const inorderResult = bst.inorderTraversal();
console.log(inorderResult); // 输出 [1, 3, 4, 6, 7, 8, 10, 13, 14]

// 删除节点
bst.remove(7);
console.log(bst.inorderTraversal()); // 输出 [1, 3, 4, 6, 8, 10, 13, 14]

以上就是Javascript中二叉搜索树的基本实现。通过这种数据结构,我们能够高效地进行插入、搜索和删除等操作。希望这个简单的介绍对你有帮助!