不懂就问系列:如何不递归遍历层级结构?

2019-04-24 15:15:22 +08:00
 onlinewjm

Souce Data:

[
  {
    "Id": 1,
    "Name": "顶级",
    "Pid": 0,
    "Children": [
      {
        "Id": 2,
        "Name": "层级二 A",
        "Pid": 1,
        "Children": [
          {
            "Id": 5,
            "Name": "层级三 A",
            "Pid": 2,
            "Children": null
          }
        ]
      },
      {
        "Id": 3,
        "Name": "层级二 B",
        "Pid": 1,
        "Children": [
          {
            "Id": 4,
            "Name": "层级三 B",
            "Pid": 3,
            "Children": null
          }
        ]
      }
    ]
  }
]

Target Data:

[{
    "Id": 1,
    "Name": "顶级",
    "Pid": 0
},{
    "Id": 2,
    "Name": "层级二 A",
    "Pid": 1
}, {
    "Id": 5,
    "Name": "层级三 A",
    "Pid": 2
},{
    "Id": 3,
    "Name": "层级二 B",
    "Pid": 1
}, {
    "Id": 4,
    "Name": "层级三 B",
    "Pid": 3
}]
1852 次点击
所在节点    问与答
8 条回复
SorcererXW
2019-04-24 15:34:58 +08:00
就模拟递归栈,用个栈来存,每次弹出栈顶节点,将此节点的所有子节点入栈。循环直到栈为空
ywcjxf1515
2019-04-24 15:59:43 +08:00
和上面类似的,用一个队列来存,对于队列中的每个节点,把其子节点入队,之后把该节点出队,循环直到队列为空。参见深度优先搜索和广度优先搜索。
kljsandjb
2019-04-24 16:09:43 +08:00
用 stack
mugglezzz
2019-04-24 16:09:45 +08:00
onlinewjm
2019-04-24 17:34:48 +08:00
@ywcjxf1515
@SorcererXW
@kljsandjb

感谢老哥指点~
rookiebulls
2019-04-24 18:50:38 +08:00
搭车问一下,如何把 target data 转为 sourcee data
smdbh
2019-04-24 21:28:27 +08:00
广度 vs 深度 遍历
reself
2019-04-24 23:07:07 +08:00
用队列。
函数调用就会有局部信息的入栈出栈,只不过是编译器帮你完成了而不是自己显式地去入栈出栈而已。
扩展一下,层级结构是树状,树是也是一种图。图遍历时用栈记录路径对应着深入遍历,用队列则对应着广度遍历,很有意思的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/558268

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX