返回

JavaScript实现二叉搜索树

前端

  1. 什么是二叉搜索树

二叉搜索树(BST)是一种二叉树,其中每个节点都包含一个值,并且该值大于其左子节点的值,而小于其右子节点的值。这意味着,我们可以通过比较节点的值来快速地搜索树中的元素。

2. 如何用JavaScript实现二叉搜索树

我们可以使用JavaScript来创建一个二叉搜索树。首先,我们需要创建一个类来表示二叉搜索树的节点。

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

然后,我们需要创建一个类来表示二叉搜索树。

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

  insert(value) {
    let newNode = new Node(value);
    if (this.root === null) {
      this.root = newNode;
    } else {
      this._insert(value, this.root);
    }
  }

  _insert(value, node) {
    if (value < node.value) {
      if (node.left === null) {
        node.left = new Node(value);
      } else {
        this._insert(value, node.left);
      }
    } else {
      if (node.right === null) {
        node.right = new Node(value);
      } else {
        this._insert(value, node.right);
      }
    }
  }

  search(value) {
    if (this.root === null) {
      return null;
    } else {
      return this._search(value, this.root);
    }
  }

  _search(value, node) {
    if (value === node.value) {
      return node;
    } else if (value < node.value) {
      if (node.left === null) {
        return null;
      } else {
        return this._search(value, node.left);
      }
    } else {
      if (node.right === null) {
        return null;
      } else {
        return this._search(value, node.right);
      }
    }
  }

  delete(value) {
    if (this.root === null) {
      return;
    } else {
      this._delete(value, this.root);
    }
  }

  _delete(value, node) {
    if (value < node.value) {
      if (node.left === null) {
        return;
      } else {
        this._delete(value, node.left);
      }
    } else if (value > node.value) {
      if (node.right === null) {
        return;
      } else {
        this._delete(value, node.right);
      }
    } else {
      if (node.left === null && node.right === null) {
        node = null;
      } else if (node.left === null) {
        node = node.right;
      } else if (node.right === null) {
        node = node.left;
      } else {
        let successor = this._findSuccessor(node);
        node.value = successor.value;
        this._delete(successor.value, node.right);
      }
    }
  }

  _findSuccessor(node) {
    let current = node.right;
    while (current.left !== null) {
      current = current.left;
    }
    return current;
  }

  getMin() {
    if (this.root === null) {
      return null;
    } else {
      return this._getMin(this.root);
    }
  }

  _getMin(node) {
    if (node.left === null) {
      return node.value;
    } else {
      return this._getMin(node.left);
    }
  }

  getMax() {
    if (this.root === null) {