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

发布于 2022-09-03 07:35:39 字数 1015 浏览 24 评论 0

我有一个数组对象:

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层,请问应该怎么做呢?

谢谢!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

水溶 2022-09-10 07:35:39

加个标志就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)
        }
    }
}

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

粉红×色少女 2022-09-10 07:35:39

可以给 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);  // 假设从第一层开始
最终幸福 2022-09-10 07:35:39

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

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);
        }
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文