如何在python中使用BFS创建一棵树?

问题描述

所以我在 JSON 中有一个像这样的扁平树,作为对象数组:

[{
    aid: "id3",data: ["id1","id2"]
},{
    aid: "id1",data: ["id3",{
    aid: "id2",nested_data: {aid: "id4",atype: "nested","id3"]},data: []
}]

我想收集那棵树并用递归循环将 id 解析为数据,就像这样(假设我们从 "id3" 开始):

{
   "aid":"id3","payload":"1","data":[
      {
         "id1":{
            "aid":"id1","data":[
               {
                  "id3":null
               },{
                  "id2":null
               }
            ]
         }
      },{
         "id2":{
            "aid":"id2","nested_data":{
               "aid":"id4","atype":"nested","data":[
                  {
                     "id1":null
                  },{
                     "id3":null
                  }
               ]
            },"data":[
               
            ]
         }
      }
   ]
}

这样我们就可以进行广度优先搜索,并在第一次进入时将某些字段解析为 "value": "object with that field""value": Null

如何在python 3中做这样的事情?

解决方法

除了您的结构在语法方面存在的所有问题(标识符必须在引号内等)之外,下面的代码将为您提供所需的答案。

但是您应该仔细考虑自己在做什么,并考虑以下几点:

  • 使用您提供的平面结构中表达的关系意味着您将有无限递归,因为您的项目包含其他项目,而其他项目又包含第一个项目(例如 id3 包括 {{1} },这又包括 id1。因此,您必须定义停止条件,或者确保这不会发生在您的扁平结构中。
  • 你最初的平面结构最好是字典的形式,而不是一个 {id,data} 对的列表。这就是为什么下面的代码做的第一件事就是转换它。
  • 您最终所需的结构在所包含的信息方面存在大量冗余。考虑简化它。
  • 最后,您没有提到“nested_data”节点以及如何处理它们。我只是假设如果存在,则需要进一步扩展。

请考虑尝试在您的问题中提供一些上下文,一些真实的数据示例(我相信提供的数据不是真实数据,因此存在不一致和冗余),并尝试自己并提供您的努力;这是学习的唯一途径。

id3