首先有一个数组,比如可以定义为这样的格式
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)
通过打印的结果我们可以看出,这是一个先序遍历的方法,也就是说,可以通过一边遍历的方式一边记录每条路径的深度