数据结构 ~ 树

什么是树 - tree

一种分层数据的抽象模型;

如:DOM、级联选择、树形控件,js 中没有树

可以用 Object 构建树:

javascript 复制代码
const tree = {
  val: 'a',
  children: [
    {
      val: 'a-1',
      children: [
        {
          val: 'a-1-1',
          children: []
        }
      ]
    },
    {
      val: 'a-2',
      children: [
        {
          val: 'a-2-1',
          children: []
        }
      ]
    }
  ]
}

深度优先遍历: 尽可能深的搜索树的分支,即 children 递归

实现:

javascript 复制代码
const dfs = root => {
  console.log(root.val) // a a-1 a-1-1 a-2 a-2-1
  root.children.forEach(e => {
    dfs(e)
  })
}
dfs(tree)

广度优先遍历: 先访问离根节点最近的节点

实现:

javascript 复制代码
const bfs = root => {
  const q = [root] // 队列
  while (q.length) {
    const p = q.shift() // 队头出队、删除第一项(返回第一项)
    console.log(p.val) // a a-1 a-2 a-1-1 a-2-1
    p.children.forEach(e => {
      q.push(e)
    })
  }
}
bfs(tree)

二叉树

树中的节点最多只能有两个子节点;

使用 JS 模拟二叉树结构:

javascript 复制代码
const tree = {
  val: 'a',
  left: {
    val: 'a-left',
    left: { val: 'a-left-left', left: null, right: null },
    right: { val: 'a-left-right', left: null, right: null }
  },
  right: {
    val: 'a-right',
    left: { val: 'a-right-left', left: null, right: null },
    right: { val: 'a-right-right', left: null, right: null }
  }
}

先序遍历:

访问根节点、对根节点的左子树先序先序遍历、对根节点的右子树进行先序遍历;

输出顺序:a、a-left、a-left-left、a-left-right、a-right、a-right-left、a-right-right

javascript 复制代码
const preOrder = root => {
  if (!root) return
  console.log(root.val)
  preOrder(root.left)
  preOrder(root.right)
}
preOrder(tree)

中序遍历:

对根节点左子树进行中序遍历、访问根节点、对根节点的右子树进行中序遍历;

输出顺序:a-left-left、a-left、a-left-right、a、a-right-left、a-right、a-right-right

javascript 复制代码
const inOrder = root => {
  if (!root) return
  inOrder(root.left)
  console.log(root.val)
  inOrder(root.right)
}
inOrder(tree)

后序遍历:

根节点左子树进行后序遍历、根节点右子树进行后续遍历、访问根节点

输出顺序:a-left-left、a-left-right、a-left、a-right-left、a-right-right、a-right、a

javascript 复制代码
const postOrder = root => {
  if (!root) return
  inOrder(root.left)
  inOrder(root.right)
  console.log(root.val)
}
inOrder(tree)
相关推荐
梦境虽美,却不长2 分钟前
数据结构 学习 链表 2025年6月14日08点01分
数据结构·学习·链表
无聊的小坏坏16 分钟前
一文详解前缀和:从一维到二维的高效算法应用
数据结构·算法
梦境虽美,却不长41 分钟前
数据结构 学习 图 2025年6月14日 12点57分
数据结构·学习·
houliabc42 分钟前
【无标题】【2025年软考中级】第三章数据结构3.2 栈与队列
数据结构
蒙奇D索大43 分钟前
【数据结构】图论最短路圣器:Floyd算法如何用双矩阵征服负权图?
数据结构·算法·矩阵·图论·图搜索算法
黑听人3 小时前
【力扣 简单 C】141. 环形链表
c语言·开发语言·数据结构·算法·leetcode
谷雨不太卷3 小时前
AVL树的实现
数据结构·c++·算法
大熊猫侯佩4 小时前
Swift 初学者交心:在 Array 和 Set 之间我们该如何抉择?
数据结构·性能优化·swift
BAGAE4 小时前
使用 Flutter 在 Windows 平台开发 Android 应用
android·大数据·数据结构·windows·python·flutter
UP_Continue7 小时前
排序--计数排序
数据结构·算法