遍历、查找、深度、插入节点、删除节点、是否有和为某个数的路径、输出和为某个数的路径

树:可指多叉树或者二叉树思路遍历树,在遍历的时候同时统计当前的深度deep:遍历到当前节点时树的深度resdeep:树的最终深度当没有子节点时,说明当前的分支遍历到了尽头, deep 和 resdeep进行比较,如果deep大于resdeep ,将deep的值赋给resdeep 。每次遍历到当前分支的尽头时,将deep重置为0,现有如下树结构,得出其深度var treeList = [ { path: 'a/a', component: 'pag
摘要由CSDN通过智能技术生成

1、树:可指多叉树或者二叉树

2、树结构对应 数据放在文章底部, 文章里的所有实现都是根据这些数据结构实现的,实际操作中可适当调整

3、会逐步实现 树的其他操作,优化完善实现方法

遍历
树、类树结构的数据的遍历一般分为两种,深度优先遍历和广度优先遍历

深度优先遍历又分为了:前序遍历、中序遍历和后序遍历
广度优先遍历 :层序遍历

1、前序遍历

思路

  • 循环
  • 有children的需要将children作为输入 递归调用

实现

function fooeach(data){
   
      for(var i=0;i<data.length;i++){
   
         console.log(data[i].path);
         if(data[i].children && data[i].children.length>0){
   
            fooeach(data[i].children)
         }
      }
}
fooeach(tree);// 遍历输出树的子节点

2、树的深度

思路

  • 遍历树,在遍历的时候同时统计当前的深度
  • deep:遍历到当前节点时树的深度
  • resdeep:树的最终深度
  • 当没有子节点时,说明当前的分支遍历到了尽头, deep 和 resdeep进行比较,如果deep大于resdeep ,将deep的值赋给resdeep 。
  • 每次遍历到当前分支的尽头时,将deep重置为0。
  • 传入的children不能为空,否则deep出现不及时重置的情况,导致结果有误

实现

function getTreeDeep(data){
   
   var deep=0;// 统计 遍历到当前节点时的深度
   var resdeep=0; // 保存,树的最终深度 
   function fooeach(data){
   
      for(var i=0;i<data.length;i++){
   
         // 有路径时,深度加1
         if(data[i].path){
    
            deep++; 
         }
         // 有children 并且children不为空时,调用自身 
         if(data[i].children && data[i].children.length>0){
   
            fooeach(data[i].children);
         }else{
    // 没有children了,该分支已到了尽头,进行比较、赋值、重置 
            if(deep>resdeep){
   
               resdeep=deep;
            }
            deep=0;// 深度重置
         }
      }
   }
   fooeach(data)
   console.log(resdeep, '---- 树的深度是')
}
getTreeDeep(bianlitree(treeList);
)

3、查找节点

思路

  • 遍历
  • 逐一将每个节点和要查找的节点逐一对比
  • 有则有,无则无

实现

function findNode(data,node){
   
   var flag=false;
   function fn(data){
   
      for(var i=0;i<data.length;i++){
   
        if(data[i].path==node){
    // 找到后立即退出
          flag=true;
          return
        }else{
   
          if(data[i].children && data[i].children.length>0){
   
            fn(data[i].children);
          
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值