不确定层级含有children节点的数组结构如何遍历?

发布于 2022-09-04 15:48:26 字数 634 浏览 13 评论 0

数据结构如下:

[
    {
        'xx': 'oo',
        'children': [
            {
                'xx': 'oo',
                'children': [
                    {
                        'xx': 'oo',
                        'children': []
                    },
                ]
            },
            {
                'xx': 'oo',
                'children': []
            }
        ]
    },
    {
        'xx': 'oo',
        'children': []
    }
]

层级数量不确定,每个节点都有一个children节点,children节点为不确定数量的数组,children节点的结构跟父级结构一样,如果数据量不大的话可以很容易用递归去遍历,但我发现这个并不能用尾递归去优化,那如果数据量很大的话就有爆栈的可能性,这种情况下该如何处理呢?

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

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

发布评论

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

评论(1

傻比既视感 2022-09-11 15:48:26

树遍历可用循环代替递归。广度优先用一个队列:

bfs(root)
  q ← empty_queue()
  q.enqueue(root)
  while (q not empty)
    node ← q.dequeue()
    visit(node.xx)
    for x in node.children
      if (x ≠ {}) q.enqueue(x)

调用方式:

bfs({xx:oo, your_array})

深度拷贝的话,可以用两个队列,一个盛放原对象,一个盛放目标对象,做亦步亦趋的同步出队入队,原对象遍历的同时目标对象完成拷贝。下面代码需要借用类似C语言中“指针”的语义,x.pointer代表x这个对象本身,而不是x的值。

copy(root)
  dup ← {xx:oo, children:[]}
  q1 ← empty_queue
  q2 ← empty_queue
  q1.enqueue(root)
  q2.enqueue(dup.pointer)
  while q1. not_empty()
    src ← q1.dequeue()
    ptr ← q2.dequeue()
    ptr.xx ← src.xx
    ptr.children ← src.children
    for i from 1 to src.children.size()
      if (src.children[i] ≠ {})
        q1.enqueue(src.children[i])
        q2.enqueue(ptr.children[i].pointer)
  return dup
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文