JavaScript:求嵌套集合对象的最大深度
嵌套集合最大深度计算修正方案
你的递归函数结果总是差1,核心原因是计数起始点和实际需求的层级定义不匹配:
假设示例中最深路径是「根节点 → 子节点1 → 子节点2 → 子节点3」(共4层),你当前调用函数时传入的是根节点.children(),但函数会把这些子节点当作第1层开始计数,最终得到3,比实际期望的4少1。
修正方案1:调整函数接收单个节点(推荐)
修改函数,让它从单个节点开始递归计数,把当前节点本身算入层级:
var getLevelFunc = function(node) { // 没有子节点时,当前节点自身就是1层 if (!node.children() || node.children().length === 0) { return 1; } var maxChildDepth = 0; for (var c = 0; c < node.children().length; c++) { var childDepth = getLevelFunc(node.children()[c]); if (childDepth > maxChildDepth) { maxChildDepth = childDepth; } } // 当前节点的层级 = 子节点最大深度 + 1 return maxChildDepth + 1; }
调用方式:传入根节点 getLevelFunc(rootNode),即可得到正确的深度值(比如示例中的4)。
修正方案2:保留原函数参数,调用时补全根节点层级
如果必须保持函数接收节点集合的形式,只需在调用结果上加1(把根节点的层级补上):
// 原函数不变 var getLevelFunc = function (children) { var depth = 0 for (var c = 0; c < children.length; c++) { let child= children[c]; if (child.children() != null && child.children().length > 0) { var tempDepth = getLevelFunc(child.children()); if (tempDepth > depth) { depth = tempDepth } } } return 1 + depth; } // 调用时补加根节点层级 var totalDepth = getLevelFunc(rootNode.children()) + 1;
原理说明
原函数的计数逻辑是:传入的节点集合中的每个节点,其层级为「子树深度 + 1」,但这个计数是从传入的节点开始的,没有包含它们的父节点(也就是根节点)。所以要么修改函数从单个节点开始计数,要么在调用时手动补上根节点的1层。
内容的提问来源于stack exchange,提问作者Alster
相关产品推荐
相关产品推荐

