返回

二叉树:JavaScript中的数据结构实现

前端

JavaScript 实现数据结构——二叉树

在计算机科学中,树是一种常见的数据结构,它可以用来组织和存储数据。二叉树是一种特殊的树,每个节点最多有两个子节点。

二叉树的基本概念

二叉树的基本概念包括:

  • 节点: 二叉树中的每个元素称为节点。
  • 根节点: 二叉树的第一个节点称为根节点。
  • 左子节点: 每个节点的左子节点是该节点的第一个子节点。
  • 右子节点: 每个节点的右子节点是该节点的第二个子节点。
  • 父节点: 每个节点的父节点是该节点的父节点。
  • 子节点: 每个节点的子节点是该节点的子节点。
  • 兄弟节点: 具有相同父节点的两个节点是兄弟节点。
  • 叶节点: 没有子节点的节点称为叶节点。
  • 度: 每个节点的度是该节点的子节点数。
  • 高度: 二叉树的高度是从根节点到最长叶子节点的路径长度。
  • 深度: 二叉树的深度是从根节点到某个节点的路径长度。

二叉树的实现

JavaScript 中,我们可以使用对象来实现二叉树。每个节点可以表示为一个对象,该对象具有以下属性:

  • 值: 节点的值。
  • 左子节点: 节点的左子节点。
  • 右子节点: 节点的右子节点。

以下是一个简单的 JavaScript 二叉树实现:

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

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

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

  _insert(newNode, currentNode) {
    if (newNode.value < currentNode.value) {
      if (currentNode.left === null) {
        currentNode.left = newNode;
      } else {
        this._insert(newNode, currentNode.left);
      }
    } else {
      if (currentNode.right === null) {
        currentNode.right = newNode;
      } else {
        this._insert(newNode, currentNode.right);
      }
    }
  }

  search(value) {
    return this._search(value, this.root);
  }

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

  delete(value) {
    this._delete(value, this.root);
  }

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

  _findSuccessor(node) {
    let current