JavaScript数据结构与算法之二叉树添加/删除节点操作示例

首先让我们来介绍一下“JavaScript数据结构与算法之二叉树添加/删除节点操作示例”这个主题。

主题介绍

本主题主要介绍了在 JavaScript 中对于二叉树数据结构进行添加/删除节点操作的示例代码。二叉树是一种常见的树形结构,在计算机科学领域中被广泛应用。节点的添加与删除是该数据结构中常见的操作之一,本主题将通过示例代码,为您详细介绍操作的过程。

代码实现

首先,我们需要定义一个二叉树的节点类,包含一个值属性和左右子节点属性。这里我先给出一个简单的实现。

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

接下来,我们需要定义实现添加节点的函数 insert。这个函数的过程包含了二叉树的遍历、查找、新建节点等过程。

insert(val) {
  const newNode = new TreeNode(val);
  if (this.root === null) {
    this.root = newNode;
    return this;
  } else {
    let current = this.root;

    while (true) {
      if (val === current.val) return undefined;

      if (val < current.val) {
        if (current.left === null) {
          current.left = newNode;
          return this;
        } else {
          current = current.left;
        }
      } else {
        if (current.right === null) {
          current.right = newNode;
          return this;
        } else {
          current = current.right;
        }
      }
    }
  }
}

以上是二叉树添加节点的代码示例。

接下来,我们介绍删除节点的代码示例。删除节点的实现需要考虑到三种情况:

  • 节点没有子节点,直接删除即可
  • 节点有一个子节点,将该子节点替代被删除节点
  • 节点有两个子节点,需要在右子树中寻找最小值节点,并将该节点替代被删除节点

下面是实现删除节点的代码示例:

delete(val) {
  if (this.root === null) return false;

  let currentNode = this.root;
  let parentNode = null;
  let isLeftChild = false;

  while (currentNode !== null) {
    if (val === currentNode.val) {
      if (currentNode.left === null && currentNode.right === null) {
        if (currentNode === this.root) {
          this.root = null;
        } else if (isLeftChild) {
          parentNode.left = null;
        } else {
          parentNode.right = null;
        }
      } else if (currentNode.left === null) {
        if (currentNode === this.root) {
          this.root = currentNode.right;
        } else if (isLeftChild) {
          parentNode.left = currentNode.right;
        } else {
          parentNode.right = currentNode.right;
        }
      } else if (currentNode.right === null) {
        if (currentNode === this.root) {
          this.root = currentNode.left;
        } else if (isLeftChild) {
          parentNode.left = currentNode.left;
        } else {
          parentNode.right = currentNode.left;
        }
      } else {
        let replacementNode = currentNode.right;
        let replacementParentNode = currentNode;

        while (replacementNode.left !== null) {
          replacementParentNode = replacementNode;
          replacementNode = replacementNode.left;
        }

        if (replacementNode !== currentNode.right) {
          replacementParentNode.left = replacementNode.right;
          replacementNode.right = currentNode.right;
        }

        if (currentNode === this.root) {
          this.root = replacementNode;
        } else if (isLeftChild) {
          parentNode.left = replacementNode;
        } else {
          parentNode.right = replacementNode;
        }

        replacementNode.left = currentNode.left;
      }

      return true;
    } else if (val < currentNode.val) {
      parentNode = currentNode;
      currentNode = currentNode.left;
      isLeftChild = true;
    } else {
      parentNode = currentNode;
      currentNode = currentNode.right;
      isLeftChild = false;
    }
  }

  return false;
}

以上就是二叉树删除节点的代码示例。

示例说明

此处给出两个关于添加节点和删除节点操作的示例,方便您了解二叉树数据结构的操作过程。

示例一:添加节点操作

假设有一个空白的二叉树,我们要添加以下数据:6, 4, 8, 3, 5, 7, 9。

const bst = new BinarySearchTree();
bst.insert(6);
bst.insert(4);
bst.insert(8);
bst.insert(3);
bst.insert(5);
bst.insert(7);
bst.insert(9);

这样就完成了二叉树的添加节点操作。

示例二:删除节点操作

假设有一个已经包含数据 6, 4, 8, 3, 5, 7, 9 的二叉树,我们需要删除节点为 4 的节点。

const bst = new BinarySearchTree();
bst.insert(6);
bst.insert(4);
bst.insert(8);
bst.insert(3);
bst.insert(5);
bst.insert(7);
bst.insert(9);
bst.delete(4);

这样就完成了二叉树的删除节点操作。

总结

二叉树作为一种常见的树形数据结构,在很多场景下都有广泛的应用。本文通过 JavaScript 实现的方式,为您介绍了二叉树的添加、删除节点操作。希望这篇文章能够对您理解二叉树数据结构有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript数据结构与算法之二叉树添加/删除节点操作示例 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • 修复IE9&safari 的sort方法

    修复IE9和Safari的sort()方法需要遵循以下步骤: 1. 检查代码 要修复排序方法,首先需要检查代码,找出可能存在的问题。请确保你的代码中使用的是正确的sort()方法,并且没有拼写错误和语法问题。同时,还要检查你的代码能否适用于所有浏览器。 2. 自定义排序方法 当浏览器不支持sort()方法时,我们可以自定义一个排序方法来替代它。我们可以使用J…

    算法与数据结构 2023年5月19日
    00
  • 算法之排序算法的算法思想和使用场景总结

    算法之排序算法的算法思想和使用场景总结 一、引言 排序算法是计算机科学基础中的一个重要的部分。随着数据规模的增大,如何高效地对数据进行排序也成为了计算机科学中的重要问题。各种排序算法针对不同的数据结构和数据规模,具有不同的时间和空间复杂度。通过了解不同的排序算法的算法思想和使用场景,可以帮助我们更好地选择合适的排序算法。 二、排序算法的分类 常见的排序算法可…

    算法与数据结构 2023年5月19日
    00
  • C++中二叉堆排序详解

    C++中二叉堆排序详解 什么是二叉堆排序 二叉堆是一种特殊的二叉树,它有两个特性: 根节点的键值是所有节点中最小/最大的; 对于节点i的键值一定不大/小于它的父节点i/2。 根据第二个规则,我们可以对于任何一个节点i,以i为根的子树都是一个小根堆/大根堆。将二叉堆中最小/最大的根节点取出,然后将最后一个节点放到根位置,再对根节点进行一次向下调整的操作,就可以…

    算法与数据结构 2023年5月19日
    00
  • MySQL排序原理和案例详析

    MySQL排序的原理主要包括内部排序和外部排序两种方式。内部排序主要用于处理较小的数据集,而外部排序则专门用于处理大型数据集。 在内部排序中,MySQL主要采用快速排序算法进行排序。快速排序是一种常用的分治算法,其核心思想是通过将一个大问题分解成多个小问题并逐步解决,最终将所有小问题关键字的排序结果合并起来得到整个序列的有序排列。 在外部排序中,MySQL采…

    算法与数据结构 2023年5月19日
    00
  • Java冒泡排序(Bubble Sort)实例讲解

    下面我将为你详细讲解“Java冒泡排序(Bubble Sort)实例讲解”的完整攻略。 1. 冒泡排序简介 冒泡排序(Bubble Sort)是一种简单且常见的排序算法。它通过重复地遍历待排序数组,每次遍历将两个相邻的元素进行比较,如果它们的顺序错误就交换它们的位置,直到没有需要交换的元素为止。 2. 冒泡排序Java实现 下面是一个Java实现冒泡排序的示…

    算法与数据结构 2023年5月19日
    00
  • Linux静态链接库使用类模板的快速排序算法

    下面是对“Linux静态链接库使用类模板的快速排序算法”的详细讲解。 简介 静态链接库是一种文件格式,其中包含了许多可共享的目标文件,这些目标文件可以在运行时被动态链接器加载。可以将静态链接库视为预编译的代码,包含在可执行程序中,因此在执行时无需加载库文件,从而提高程序的运行效率。 在Linux下,可以使用静态链接库的方式来实现类模板的快速排序算法,具有较高…

    算法与数据结构 2023年5月19日
    00
  • Java冒泡排序法和选择排序法的实现

    Java的冒泡排序法和选择排序法都是常用的排序算法,冒泡排序法和选择排序法的原理都很简单,但是实现方法有一些区别。 冒泡排序法 冒泡排序法的原理是通过不断交换相邻的元素,比较他们的大小,将大的数不断上移或者将小的数下移,直到整个序列排好顺序。 以下是Java实现冒泡排序法的代码: public class BubbleSort { public static…

    算法与数据结构 2023年5月19日
    00
  • C++超详细讲解贪心策略的设计及解决会场安排问题

    C++超详细讲解贪心策略的设计及解决会场安排问题 什么是贪心算法 贪心算法是一种近似算法,通常用于求解最优化问题。在每一步,贪心算法总是做出在当前看来最优的选择,并希望通过这样的选择最终能达到全局最优。 解决会场安排问题的贪心策略 问题描述 为了方便会议的安排,需要一个会议室来容纳所有的会议。现在有n个会议需要在会议室中安排,假设每个会议被安排在一个时间段内…

    算法与数据结构 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部