叉树先序遍历问题,如何取得每一个数据所在的层数?

jrainlau
  • 12.3k

我有一个数组对象:

let treeObj = {
    '1': [
        { '2': [{ '5': [{ '11': '11' }, { '12': '12' }, { '13': '13' }, { '14': '14' }] }] },
        { '3': [{ '6': '6' }, { '7': '7' }] },
        { '4': [{ '8': '8' }, { '9': '9' }, { '10': '10' }] }
    ]
}

图片描述
通过先序遍历的方法,我能够按顺序取得所有的key值:

let traverseNode = (node) => {
    if (typeof node !== 'string') {
        let key = Object.keys(node)
        console.log(key)
        for (let i = 0; i < node[key].length; i++) {
            traverseNode(node[key][i])
        }
    }
}

traverseNode(treeObj)

/* 输出结果如下
[ '1' ]
[ '2' ]
[ '5' ]
[ '11' ]
[ '12' ]
[ '13' ]
[ '14' ]
[ '3' ]
[ '6' ]
[ '7' ]
[ '4' ]
[ '8' ]
[ '9' ]
[ '10' ]
*/

现在我想知道每一个key值所在的层数,比如['1']在第1层,[ '2' ][ '3' ][ '4' ]在第2层,请问应该怎么做呢?

谢谢!

评论
阅读 1.9k
3 个回答
✓ 已被采纳

加个标志就OK了

let traverseNode = (node, lv = 0) => {
    if (typeof node !== 'string') {
        let key = Object.keys(node)
        console.log(key, lv)
        for (let i = 0; i < node[key].length; i++) {
            traverseNode(node[key][i], lv++)
        }
    }
}

您看这样可以不

---分割线---

之前明显得错误,(自己掌嘴)

let traverseNode = (node, lv = 1) => {
    if (typeof node !== 'string') {
        let key = Object.keys(node)
        console.log(key, lv)
        for (let i = 0; i < node[key].length; i++) {
            traverseNode(node[key][i], lv + 1)
        }
    }
}

这样输出应该是符合题主意思的

可以给 traverseNode 函数加个参数表示层级

         let traverseNode = (node, level) => {  // 增加个参数level表示当前node在第几层
             if (typeof node !== 'string') {
                 let key = Object.keys(node)
                 console.log(key[0]+"==="+level);
                 for (let i = 0; i < node[key].length; i++) {
                     traverseNode(node[key][i], level+1);
                 }
             }
         }

         traverseNode(treeObj, 1);  // 假设从第一层开始

把深度也当作参数传进去就行了

function traverseNode(tree, deep = 0) {
    let ans;
    for(let i in tree) if(tree.hasOwnProperty(i)) {
        ans = i;
        break;
    }
    console.log("节点值:" + ans + ",深度:" + deep);
    if(tree[ans] instanceof Array) {
        for(let i = 0; i < tree[ans].length; i++) {
            traverseNode(tree[ans][i], deep + 1);
        }
    }
}
撰写回答

登录后参与交流、获取后续更新提醒

宣传栏