2014-12-30 22 views
0

我想遍历树数据,将该场景模拟为自解释的python脚本。我无法找到为什么水平节点不能在递归中遍历。图递归水平(宽度优先)搜索

说明:第一个字符串是脚本中树的表示形式。 get_childrens方法是我如何从数据库获得响应。

""" 
          1 
    11    |    12      |   13 
111  112 113 | 121   122    123  | 
        |    1221 1222     | 

""" 

# Do not edit this function in the same format getting data 
def get_childrens(i): 
    if i==1: return [11,12,13] 
    if i==11: return [111,112,113] 
    if i==12: return [121,122,123] 
    if i==122: return [1221,1222] 

def create_tree(nodeid): 
    child_users=get_childrens(nodeid) 
    if child_users: 
     child_users=[user for user in child_users] 
    else: 
     return 

    return { 
     "data":{ 
      "type":nodeid 
     }, 
     "children": [create_tree(e) for e in child_users if create_tree(e)] 
    } 



if __name__=="__main__": 
    import json 
    data= create_tree(1) 

    print json.dumps(data , indent=4) 
    print "####################### GETTING THIS #####################" 
    { 
     "data": { 
      "type": 1 
     }, 
     "children": [ 
      { 
       "data": { 
        "type": 11 
       }, 
       "children": [] 
      }, 
      { 
       "data": { 
        "type": 12 
       }, 
       "children": [ 
        { 
         "data": { 
          "type": 122 
         }, 
         "children": [] 
        } 
       ] 
      } 
     ] 
    } 
    print "###################### EXPECTED THIS #####################" 
    print json.dumps({"data":{"value":1}, 
     "children":[ 
        {"data":{"value":11}, 
        "children":[ 
         {"data":{"value":111},"children":[]}, 
         {"data":{"value":112},"children":[]}, 
         {"data":{"value":113},"children":[]}, 
         ], 
        }, 
        {"data":{"value":12}, 
        "children":[ 
         {"data":{"value":121},"children":[ 
            {"data":{"value":1221},"children":[]}, 
            {"data":{"value":1222},"children":[]}, 
                  ]}, 
         {"data":{"value":122},"children":[]}, 
         {"data":{"value":123},"children":[]}, 
         ], 
        }, 
        {"data":{"value":13}, 
        "children":[ 

         ], 
        }      
        ] 

    },indent=4) 

回答

2

随着

[create_tree(e) for e in child_users if create_tree(e)] 

你商讨消除谁不反过来有孩子的儿童。因此,例如"data":{"value":1}只会以子女1112结束,这些子女本身确实有一些子女,但不是13,这并不是。

我怀疑这是错误的逻辑,而是你的意思是,而更像

[create_tree(e) or e for e in child_users] 
0

感谢亚历克斯,返回,而不是空的解决了这个问题的数据。

def create_tree(nodeid): 
    child_users=get_childrens(nodeid) 
    if child_users: 
     child_users=[user for user in child_users] 
    else: 
     return { 
       "data":{ 

       "type":nodeid 
       }, 
       "children": [] 
      } 

    return { 
       "data":{ 

       "type":nodeid 
       }, 
       "children": [create_tree(e) or e for e in child_users] 
      } 
+1

我建议你移动给你的Q的编辑 - 这是在适当的为A.此外,如果我的A帮助,这是很好的做法给予好评,并接受它... –