从树中收集数据

时间:2015-11-12 17:27:33

标签: python search tree

考虑我有以下树木列表:

数据

data = [
    {'id': 'a',
     'x': 17,
     'children': [
         {'id': 'aa',
          'y': 14,
          'children':
              [{'id': 'aaa',
                'y': 14}]},
         {'id': 'ab',
          'y': 132}],
     },
    {'id': 'b',
     'x': 171,
     'children': [
         {'id': 'ba',
          'children': [
              {'id:': 'baa',
               'y': 4},
              {'id': 'bab',
               'y': 132}]}]
     }
]

细节

  • 每个节点都由一个id。
  • 表示
  • 没有节点知道它的父节点,只知道它们的子节点。
  • 有些节点有x值,有些节点包含y值,有些节点没有。
  • 每棵树的深度可以更深,例如最多10层。
  • 可以安全地假设所有id都是唯一的,但节点id不反映它在树中的位置,即父母或儿童id。每个根节点都有一个x值,所有叶节点都有一个y值。

任务

我现在有节点ID,并希望用它来执行以下操作。

  1. 如果它没有x的值:向我们的父亲询问x,直到找到它的值。
  2. 如果它对y没有价值:向他们的孩子询问y的值并总结。
  3. 示例:

    • 如果感兴趣的ID为'aa',我希望获得x = 17(来自父节点'a')和y=14
    • 如果感兴趣的ID为'bb',我希望获得x = 171(来自父节点'b')和y=136(儿童y值的总和)。

    到目前为止

    我想出了一个遍历树列表的递归方法,并成功找到正确的id并在之后停止搜索。它还打印一些调试,包括递归级别作为空间(我更容易实现正在发生的事情)

    def tree_search(data, id, indent=''):
        stop_search = False
        for node in data:
            if stop_search:
                break
            print indent + node.get('id', '')
            if node.get('id') == id:
                print indent + "Found id"
                print indent + "gather x from father"  # but who is the father or the grandfather??
                print indent + "gather y from children"
                return True
    
            elif 'children' in node:
                print indent + "going deeper"
                stop_search = tree_search(node["children"], id, indent+' ')
    

    但是现在我陷入了如何从父亲或祖父那里得到x(无论是谁提出第一个x)以及如何从孩子那里找到y。当每个节点知道它的孩子时,第二个似乎更容易。 关于如何继续这个的任何提示?

0 个答案:

没有答案