递归获取树形数据太慢_数据结构之树

1、树

定义:一种分层数据的抽象模型。

前端工作中常见的树:DOM树、级联选择、树形选择

JS 中没有树,但可以用 Object 和 Array 构建树

树的常用操作:深度/广度优先遍历、先中后序排列

2、什么是深度/广度遍历

深度优先遍历:尽可能深的搜索树的分支

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

深度优先遍历口诀

  • 访问根节点
  • 对根节点的children挨个进行深度优先遍历

a54b759984c724109c60a1fde3df0e6a.png
深度优先遍历

广度优先遍历口诀

  • 新建一个队列,把根节点入队
  • 把队头出队并访问
  • 把队头的children挨个入队
  • 重复第二第三步,直到队列为空

56698b60f4a2ce6ee5fd44d09d4f5f3d.png
广度优先遍历
const tree = {
  val: 'a',
  children: [
    {
      val: 'b',
      children: [
        {
          val: 'd',
          children: []
        },
        {
          val: 'e',
          children: []
        }
      ]
    },
    {
      val: 'c',
      children: [
        {
          val: 'f',
          children: []
        },
        {
          val: 'g',
          children: []
        }
      ]
    }
  ]
};

ade21b052a8afdac56c5637390dfc8e1.png
深度优先遍历代码实现

b9b85a527f4bac8b366cc04ec344e064.png
广度优先遍历代码实现

3、二叉树的先中后序遍历

二叉树定义:树的每个节点最多只能有两个子节点

在 JS 中通常用 Object 来模拟二叉树

2835baf317527cffcb7008209ebe390b.png

先序遍历算法口诀

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

中序遍历算法口诀

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

后序遍历算法口诀

  • 对根节点的左子树进行后序遍历
  • 对根节点的右子树进行后序遍历
  • 访问根节点

55052a0038353618d13187a6f8767d1e.png
const bt = {
  val: 1,
  left: {
    val: 2,
    left: {
      val: 4,
      left: null,
      right: null,
    },
    right: {
      val: 5,
      left: null,
      right: null
    }
  },
  right: {
    val: 3,
    left: {
      val: 6,
      left: null,
      right: null
    },
    right: {
      val: 7,
      left: null,
      right: null
    }
  }
}

module.exports = bt;

先序遍历代码实现(递归版)

f0f165c72d225a7eb56dc18c68c950b6.png
先序遍历代码实现(递归版)

中序遍历代码实现(递归版)

877e01ba77b183878db329b84e8c6718.png
中序遍历代码实现(递归版)

后序遍历代码实现(递归版)

e183b93784e279d1d4bc6618bf174ead.png
后序遍历代码实现(递归版)

先序遍历代码实现(非递归版)

4a2d8983c9d95e32305d08ff96348e30.png
先序遍历代码实现(非递归版)

中序遍历代码实现(非递归版)

cbca2ac2e96800d67058b61afbb9988e.png
中序遍历代码实现(非递归版)

后序遍历代码实现(非递归版)

bcf17ea3dd8a488c34956535eccfcc2a.png
后序遍历代码实现(非递归版)

4、遍历 JSON 的所有节点值

fad0bcf37768b0410a585cf3ed4654a1.png

956cdfc14039d191801528bf99b5e3e5.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值