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日

相关文章

  • JavaScript数据结构yocto queue队列链表代码分析

    JavaScript数据结构yocto queue队列链表代码分析 什么是队列? 队列(Queue)是一种基础的数据结构,属于线性结构,它的特点是在队列尾插入元素,同时在队列头删除元素,遵循先进先出(FIFO)的原则。队列可以简单的理解为排队,先到达的先被服务,而后到达的则等在队列尾排队等待。队列的应用非常广泛,例如排队系统、消息队列等。 队列的实现方式 队…

    数据结构 2023年5月17日
    00
  • Java数据结构之最小堆和最大堆的原理及实现详解

    Java数据结构之最小堆和最大堆的原理及实现详解 什么是堆? 堆是一种特殊的树形数据结构,它满足以下两个条件: 堆是一个完全二叉树,即除了最后一层,其他层都必须填满,最后一层从左到右填满 堆中每个节点的值必须满足某种特定的条件,例如最小堆要求每个节点的值都小于等于其子节点的值。 堆一般分为两种类型:最小堆和最大堆。 最小堆:每个节点的值都小于等于其子节点的值…

    数据结构 2023年5月17日
    00
  • java数据结构之实现双向链表的示例

    Java数据结构之实现双向链表的示例 1. 什么是双向链表? 双向链表,英文名为doubly linked list,是一种链表结构。与单向链表不同,双向链表中的每一个节点除了保存了指向下一个节点的指针外,还保存了指向前一个节点的指针。因此,双向链表可双向遍历,可以从前向后或从后向前遍历。 2. 双向链表的实现 2.1 节点类的实现 创建节点类Node,并定…

    数据结构 2023年5月17日
    00
  • C语言数据结构之队列的定义与实现

    C语言数据结构之队列的定义与实现 什么是队列 队列是一种特殊的线性数据结构,它只允许在队列的头部进行删除操作,在队列的尾部进行插入操作,这种操作方式被成为“先进先出”或“FIFO(first in first out)”。 队列的实现方式 队列可以通过数组和链表两种方式进行实现。 1. 数组实现 数组实现队列时,可以定义一个存放元素的数组,同时需要记录队列的…

    数据结构 2023年5月17日
    00
  • Huffman实现

    Huffman编码树 秒懂:【算法】Huffman编码_哔哩哔哩_bilibili 约定:字符x的编码长度 就是其对应叶节点的深度; 在一个字符集中,每个字符出现的次数有多有少,那么若都采用固定长度编码的话,那么编码长度会非常大,并且搜索时间复杂度都非常高;若采用非固定编码,出现次数多的字符编码长度小一些,并且放在树深度小的地方,提高搜索时间效率;这样带权平…

    算法与数据结构 2023年4月17日
    00
  • Java数据结构与算法实现递归与回溯

    Java数据结构与算法实现递归与回溯攻略 什么是递归与回溯 递归是指函数调用自己的过程。在递归过程中,一般需要包含两个部分:递归调用过程和递归出口。递归应用广泛,例如在计算机科学中,递归可应用于算法设计中的分治思想和动态规划。 回溯是指在解决问题时,尝试每一种可能的分步方法,当尝试后发现该方法不行时,取消当前尝试的分步方法,回到上一步,再使用其他可能的分步方…

    数据结构 2023年5月17日
    00
  • Java数据结构与算法之单链表深入理解

    Java数据结构与算法之单链表深入理解攻略 什么是单链表? 单链表(Singly Linked List)是指一个节点只指向下一个节点的链表。 单链表由多个节点组成,每个节点有两个属性:数据域和指针域。数据域保存节点的数据,指针域保存下一个节点的指针,因此每个节点包含两个域:data和next。 单链表的基本操作 单链表常用的基本操作包括: 在链表头部添加元…

    数据结构 2023年5月17日
    00
  • java实现队列数据结构代码详解

    Java实现队列数据结构代码详解 1. 队列数据结构简介 队列(Queue)是一种先进先出(FIFO)的数据结构,支持在一端插入元素,在另一端删除元素并返回删除的元素。其操作包括入队(enqueue)和出队(dequeue)。 2. 队列实现方法 队列可以通过数组或链表来实现。其中,数组实现的队列称为顺序队列,链表实现的队列称为链式队列。 2.1 顺序队列 …

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