js如何遍历查询一个颗树

近段时间去面试的时候,被面试官问到如何遍历查询一个颗树的时候,可能最近自己看了数据结构的书之后,隐隐约约就想到二叉树的三种排序(前序、中序、后序),但是当时自己没有想起这三种排序的名字,只是回答说好像有三种,但是当时面试官好像突然明白了,说你是不是想说前序、中序、后序,我回答说是的,然后面试官淡淡回了一句说不是,后面我回去查了下,才知道不是,突然间顿悟了,不就是我们经常所说的递归吗?感觉自己没有回答到点子上面,但是只回递归的话,无法加分的,从网上查了之后,才知道除了递归,还有循环,再拓展一点,大体分为深度优先遍历和广度优先遍历两种方法,下面我们逐一讲解。
我们正常的思维或许第一采取的就是深度优先遍历,然后用递归实现,如下:
先定义一颗树:

let tree = [
{
  id: '1',
  name: '节点1',
  children: [
    {
      id: '1-1',
      name: '节点1-1'
    }
  ]
},
{
  id: '2',
  name: '节点2',
  children: [
    {
      id: '2-1',
      name: '节点2-1'
    },
    {
      id: '2-2',
      name: '节点2-2',
      children: [
        {
          id: '2-2-1',
          name: '节点2-2-1'
        }
      ]
    }
  ]
},
{
  id: '3',
  name: '节点3'
}
]

然后用递归实现:

function treeIterator(tree, func) {
  tree.forEach((node) => {
    func(node)
    node.children && treeIterator(node.children, func)
  })
}

其实还可以用循环去实现:

function treeIterator(tree, func) {
  let node, curTree = [...tree]
  while ((node = curTree.shift())) {
    func(node)
    node.children && curTree.unshift(...node.children)
  }
}

打印出来:

节点1 节点1-1 节点2 节点2-1 节点2-2 节点2-2-1 节点3...

如果再问你用了什么数据结构,怎么回答呢?
答案:用了,先进后出!

接下来就到广度优先遍历
循环实现:

function treeIterator(tree, func) {
  let node, curTree = [...tree]
  while ((node = curTree.shift())) {
    func(node)
    node.children && curTree.push(...node.children)
  }
}

打印出来:

节点1 节点2 节点3 节点1- 1节点2-1 节点2-2 节点2-2-1...

继续问用了什么数据结构?
答案:用了队列,先进先出!!

参考博客:https://blog.csdn.net/w544924116/article/details/119712713?spm=1001.2014.3001.5506

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值