获取数组(树)的最大深度(JS)

首先有一个数组,比如可以定义为这样的格式

  var treeArr={
    name:'root',
    child:[
      {
        name: 'a',
        child: [
          {
            name: 'b',
            child: [
              {name: 'd'},
              {
                name: 'e',
                child:[
                  {name: 'h'},
                  {
                    name: 'i',
                    child: [
                      {name: 'j'}
                    ]
                  },
                ]
              },
            ],
          },
          {
            name: 'c',
            child: [
              {name: 'f'},
              {
                name: 'g',
                child:[
                {name: 'k'},
                {name: 'l'},
                {name: 'm'},
                {name: 'n'},
                ]
              },
            ]
          },
        ]
      }
    ]
  }

直观一点我们也可以把这样形式定义的数组看成是树形结构
在这里插入图片描述

从图中来看,这个数组的最大深度也就是 {root,a,b,e,i,j} = 6
那么如果用JS的语言来求出最大深度我们可以利用递归的思想

程序思路

首先我们可以先定义一个计数器 把他命名为 “i”,初始值为0,如果这个数据有child数组,那么就让 i 这个计数器+1,然后通过循环当前数据数组调用递归的方式找出所有的路径,并记录每条路径的深度,然后把每一条的深度放进一个数组里去,在通过比较就可以知道最大深度是多少了,比如我们定义好的这个数组他的路径一共有8条分别是:
{root,a,b,d},{root,a,b,e,h},{root,a,b,e,i,j},{root,a,c,f},{root,a,c,g,k},{root,a,c,g,l},{root,a,c,g,m}.{root,a,c,g,n}
再把它们的深度放到数组里之后就是 [4,5,6,4,5,5,5,5]

代码实现

  var deepArr = [];				//定义存放每条路径深度的数组
  getDeep(treeArr,0,deepArr);	//调用函数,三个参数分别为,结点,计数器,以及存放深度的数组

  function getDeep(data,i,deepArr){
  	//获取当前结点的子数组,并且打印当前结点的值
  	console.log(data.name)
    var treeRoot = data.child
    //如果当前结点没有子数组了(没有子结点)就跳出当前递归,并且使计数器+1,并把计数器i的值存入深度数组中
    if(!treeRoot){
      i++
      deepArr.push(i);
      return
    }
    //如果当前结点有子数组,就要使计数器+1
    i++
    //通过for循环来找出每一条路径,对遍历到的结点使用递归
    for(let j=0;j<treeRoot.length;j++){
      getDeep(treeRoot[j],i,deepArr)		//递归时传入的就是当前结点的第j个子结点,当这第j个子结点中的所有子孙结点全部遍历完成之后,再去遍历第j+1个结点的所有子孙结点
    }
  }
  //最后的到的这个深度数组,就可以通过对每一项进行比较从而得出最大值即最大深度
  console.log(deepArr)

通过打印的结果我们可以看出,这是一个先序遍历的方法,也就是说,可以通过一边遍历的方式一边记录每条路径的深度
在这里插入图片描述
在这里插入图片描述

获取形数据的递归算法可以使用深度优先遍历(DFS)或广度优先遍历(BFS)。以下是使用 DFS 的实现示例: ```javascript function getTreeList(treeData, parentId = null) { const result = []; for (let i = 0; i < treeData.length; i++) { const node = treeData[i]; if (node.parentId === parentId) { const children = getTreeList(treeData, node.id); if (children.length) { node.children = children; } result.push(node); } } return result; } ``` 其中,`treeData` 是原始的形数据,`parentId` 是当前节点的父节点 ID。首先创建一个数组 `result`,然后遍历原始数据,找到所有父节点 ID 为当前节点 ID 的子节点,并递归获取子节点的子节点,直到没有子节点为止。如果当前节点有子节点,则将子节点数组添加到当前节点的 `children` 属性中,最后将当前节点添加到 `result` 数组中并返回。 使用示例: ```javascript const treeData = [ { id: 1, name: 'Node 1', parentId: null }, { id: 2, name: 'Node 2', parentId: 1 }, { id: 3, name: 'Node 3', parentId: 1 }, { id: 4, name: 'Node 4', parentId: 2 }, { id: 5, name: 'Node 5', parentId: 3 }, { id: 6, name: 'Node 6', parentId: null }, { id: 7, name: 'Node 7', parentId: 6 }, ]; const treeList = getTreeList(treeData); console.log(treeList); ``` 输出结果: ``` [ { "id": 1, "name": "Node 1", "parentId": null, "children": [ { "id": 2, "name": "Node 2", "parentId": 1, "children": [ { "id": 4, "name": "Node 4", "parentId": 2 } ] }, { "id": 3, "name": "Node 3", "parentId": 1, "children": [ { "id": 5, "name": "Node 5", "parentId": 3 } ] } ] }, { "id": 6, "name": "Node 6", "parentId": null, "children": [ { "id": 7, "name": "Node 7", "parentId": 6 } ] } ] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IsQtion

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值