js实现树的前、中、后、层序遍历

现有树形结构数据:

const Tree={
  pid:'',id:0,children:[
      {pid:0,id:1,children:[
            {pid:1,id:4,children:[{pid:4,id:10}]},
            {pid:1,id:5},
      ]},
      {pid:0,id:2,children:[
            {pid:2,id:6},
            {pid:2,id:7,children:[{pid:7,id:11}]},
      ]},
      {pid:0,id:3,children:[
           {pid:3,id:8},
           {pid:3,id:9,children:[{pid:9,id:12}]},
      ]},
   ]
}

数据映射的树形图如下:
在这里插入图片描述
先序遍历:根左右。此时上面数据的输出为:

0,1,4,10,5,2,6,7,11,3,8,9,12

代码实现:

function preOrderTraverse(rnode) {
    console.log(rnode.id)
    if(rnode.children){
        for(let v of rnode.children){
             preOrderTraverse(v)
        }
    }
}
preOrderTraverse(Tree)

中序遍历:左根右。此时上面数据的输出为:

10,4,1,5,0,6,2,11,7,8,3,12,9

代码实现:

function midOrderTraverse(rnode) {
    if(rnode.children&&rnode.children[0]) midOrderTraverse(rnode.children[0])
    console.log(rnode.id)
    if(rnode.children&&rnode.children.length>1){
       for(let i=0;i<rnode.children.length;i++){
           if(i!=0) 
           midOrderTraverse(rnode.children[i])
       }
    }   
}
midOrderTraverse(Tree)

后序遍历:左右根。此时上面数据的输出为:

10,4,5,1,6,11,7,2,8,12,9,3,0

代码实现:

function nextOrderTraverse(rnode){
    if(rnode.children){
        for(let v of rnode.children){
             nextOrderTraverse(v)
        }
    }
    console.log(rnode.id)
}

nextOrderTraverse(Tree)

层序遍历:逐层从左到右。此时上面数据的输出为:

0,1,2,3,4,5,6,7,8,9,10,11,12

代码实现:

function levelOrderTraverse(Tree) {
  const res=[]
  const levelNodes=[Tree]
  
  while(levelNodes.length){
      const temp=[],count=levelNodes.length
      for(let i=0;i<count;i++){
          const node=levelNodes.shift()
          temp.push(node.id)
          if(node.children) levelNodes.push(...node.children)
      }      
      res.push(...temp)
  }
  return res
}

console.log(levelOrderTraverse(Tree))
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值