JavaScript数据结构和算法之二叉树详解

JavaScript数据结构和算法之二叉树详解

什么是二叉树?

二叉树是一种树形结构,其中每个节点最多有两个子节点:左子节点和右子节点。每个节点都是一个对象,包括属性和方法。节点的属性可能包括值,左节点和右节点。节点的方法可能包括插入和删除。

二叉树的应用场景

二叉树的常用场景包括:

  • 排序算法(二叉排序树);
  • 表达式求值;
  • 线段树;
  • 图形图像学;
  • 数据压缩算法;
  • 数据库索引;
  • 网络路由表;
  • 操作系统中文件目录的存储;
  • 以及在各种算法中作为辅助数据结构等。

二叉树基本操作

1. 创建节点

创建一个二叉树节点的方法通常包括三个参数:左节点、右节点和节点的值。

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

2. 插入节点

插入节点的方法需要通过比较来确定节点的位置。如果要插入的值大于节点的值,则插入到右子树中;如果要插入的值小于节点的值,则插入到左子树中。这个操作需要递归处理。

function insertNode(root, newNode) {
  if (newNode.data < root.data) {
    if (root.left === null) {
      root.left = newNode
    } else {
      insertNode(root.left, newNode)
    }
  } else {
    if (root.right === null) {
      root.right = newNode
    } else {
      insertNode(root.right, newNode)
    }
  }
}

3. 搜索节点

搜索节点的方法需要通过比较来确定节点的位置。如果要搜索的值等于节点的值,则返回该节点;如果要搜索的值大于节点的值,则继续在右子树中查找;如果要搜索的值小于节点的值,则继续在左子树中查找。这个操作需要递归处理。

function findNode(root, data) {
  if (root === null) {
    return null
  } else if (data < root.data) {
    return findNode(root.left, data)
  } else if (data > root.data) {
    return findNode(root.right, data)
  } else {
    return root
  }
}

4. 删除节点

删除节点是比较复杂的一个操作,分为三种情况:

  • 节点没有子节点;
  • 节点仅有一个子节点;
  • 节点有两个子节点。

其中第三种情况又可以分为两种情况:

  • 在右子树中查找最小的节点,并替换要删除的节点;
  • 在左子树中查找最大的节点,并替换要删除的节点。
function removeNode(root, data) {
  function remove(node, data) {
    if (node === null) {
      return null
    }
    if (data === node.data) {
      // 节点没有子节点
      if (node.left === null && node.right === null) {
        return null
      }
      // 节点仅有一个子节点
      if (node.left === null) {
        return node.right
      }
      if (node.right === null) {
        return node.left
      }
      // 节点有两个子节点,在右子树中查找最小的节点,并替换要删除的节点
      let tempNode = node.right
      while (tempNode.left != null) {
        tempNode = tempNode.left
      }
      node.data = tempNode.data
      node.right = remove(node.right, tempNode.data)
      return node
    } else if (data < node.data) {
      node.left = remove(node.left, data)
      return node
    } else {
      node.right = remove(node.right, data)
      return node
    }
  }
  root = remove(root, data)
  return root
}

示例说明

示例一:创建一个二叉树并插入节点

let root = new Node(10)
insertNode(root, new Node(5))
insertNode(root, new Node(15))
insertNode(root, new Node(2))
insertNode(root, new Node(13))
insertNode(root, new Node(17))
console.log(root)

输出结果:

Node {
  data: 10,
  left: Node {
    data: 5,
    left: Node { data: 2, left: null, right: null },
    right: null
  },
  right: Node {
    data: 15,
    left: Node { data: 13, left: null, right: null },
    right: Node { data: 17, left: null, right: null }
  }
}

示例二:删除二叉树中的一个节点

let root = new Node(10)
insertNode(root, new Node(5))
insertNode(root, new Node(15))
insertNode(root, new Node(2))
insertNode(root, new Node(13))
insertNode(root, new Node(17))
root = removeNode(root, 15)
console.log(root)

输出结果:

Node {
  data: 10,
  left: Node {
    data: 5,
    left: Node { data: 2, left: null, right: null },
    right: null
  },
  right: Node {
    data: 17,
    left: Node { data: 13, left: null, right: null },
    right: null
  }
}

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript数据结构和算法之二叉树详解 - Python技术站

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

相关文章

  • 中国剩余定理(CRT)学习笔记

    约定 \(A\perp B\) 表示 \(\gcd(A,B)=1\)。 \(A\mid B\) 表示 \(B\equiv 0\pmod{A}(A\neq0)\)。 引入 考虑以下这道题: 有物不知其數,三三數之剩二,五五數之剩三,七七數之剩二。 問物幾何?—— 《孫子算經》 也就是说,求出下列关于 \(x\) 方程组的最小整数解: \[\begin{case…

    算法与数据结构 2023年4月30日
    00
  • JavaScript队列数据结构详解

    JavaScript队列数据结构详解 本文将为大家详细讲解JavaScript队列数据结构的相关知识。 什么是队列数据结构 队列是一种线性数据结构,它只允许在队列的两端进行插入和删除操作。在队列中,新元素插入到队列的末尾,也称为队尾。而删除操作则是从队列的前面删除元素,也称为队首。 将元素插入队列的操作称为入队,将元素删除队列的操作称为出队。除此之外,还有一…

    数据结构 2023年5月17日
    00
  • C++高级数据结构之并查集

    C++高级数据结构之并查集 什么是并查集 并查集(Union Find Set)是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。常常在使用中以森林来表示。 并查集定义了如下的三种操作: 1、makeSet(s):建立一个新的并查集,其中包含s个单元素集合。 2、unionSet(x, y):把元素x和元素y所在的集…

    数据结构 2023年5月17日
    00
  • Javascript中扁平化数据结构与JSON树形结构转换详解

    一、扁平化数据结构 扁平化数据结构是指将一个JSON树形结构数据转换为一个扁平化的对象数组,通常用于在数据操作中进行遍历和检索,方便数据的处理和展示。 例如,有一个JSON树形结构数据如下: { "name": "中国", "children": [ { "name": &quo…

    数据结构 2023年5月17日
    00
  • Python 实现数据结构-堆栈和队列的操作方法

    Python 实现数据结构-堆栈和队列的操作方法 在Python中,我们可以使用列表(List)数据类型来实现堆栈和队列的操作。 堆栈(Stack)的操作方法 堆栈数据结构可以理解为一种后进先出的数据存储方式,也就是说最后放入堆栈的元素最先被取出。下面介绍一下堆栈的操作方法。 创建一个堆栈 我们可以通过创建一个空的列表来实现一个堆栈。代码如下: stack …

    数据结构 2023年5月17日
    00
  • C语言数据结构系列队列篇

    C语言数据结构系列队列篇攻略 简介 队列(Queue)是一种先进先出(First In First Out, FIFO)的线性数据结构,类似于排队买票的过程。本篇攻略将带您从以下三个方面深入浅出地了解C语言数据结构系列队列篇: 队列的特点; 队列的实现; 队列的应用。 队列的特点 队列有两个特殊的端点,队头(front)和队尾(rear)。队头指示队列的头部…

    数据结构 2023年5月17日
    00
  • C语言数据结构与算法之链表(一)

    欢迎阅读本篇文章,本文将为大家详细讲解C语言中数据结构与算法之链表。接下来,将从以下几个方面为大家讲述: 链表的定义 链表的特点 链表的分类 单向链表的实现及应用 双向链表的实现及应用 示例说明 1. 链表的定义 链表是由一系列节点组合而成的数据结构,每个节点都包含了一个数据域和一个指向下一个节点的指针域。其中,链表的头结点为第一个节点,而尾节点为最后一个节…

    数据结构 2023年5月17日
    00
  • C语言进阶数据的存储机制完整版

    C语言进阶数据的存储机制完整版攻略 1. 前言 C语言是一门高度可控的语言,其中其数据的存储机制是必须掌握的基础知识点。本文介绍了C语言数据存储的机制,包括变量在内存中的分配、指针的应用及结构体的组织等内容,旨在帮助读者掌握C语言中的数据存储机制。 2. 变量在内存中的分配 变量在内存中的分配既涉及到内存的分配可操作性,也涉及到相应的存储结构。 2.1. 变…

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