【发布时间】:2012-07-29 01:27:25
【问题描述】:
我有以下层次结构:
- A
- X : [1, 2, 3]
- Y : [4, 5]
- Z : [10, 11]
- B
- X : [6, 7]
- Y : [8]
我想要的是让以下查询给我以下结果:
get(A) ==> [1,2,3,4,5,10,11]
get(A,Y) ==> [4,5]
get(B) ==> [6,7,8]
get(B,X) ==> [6,7]
到目前为止,这似乎很容易。我可以通过 Dictionary> 来实现这一点,它可以是 Python 中的 defaultdict(lambda : defaultdict(list))。 但是,如果我需要使其更通用并具有另一个级别或另外 2 个级别怎么办? 类似的东西:
- A
- X
- i : [1]
- ii : [2,3]
- Y
- i : [4, 5]
- Z
- ii : [10, 11]
- B
- X
- ii : [6]
- iii : [7]
- Y
- i : [8]
在此示例中,第一个层次结构是第二个层次结构的“投影”,其中最后一个层次合并到父级中。因此,第一个层次结构的所有查询都应该给出相同的结果。
一些新级别的示例查询:
get(B, X, ii) ==> [6]
get(B,X) ==> [6,7] (same query and result as before)
请注意,数据仅在叶节点中。因此,对于插入,必须给出整个路径:
insert(A, X, i, 20)
这也意味着,我们可以在数据结构的构造函数中给出树的深度。
编辑:我意识到我需要验证深度:
- 插入操作:必须给出整个路径,并且 len(path) 必须等于深度
- 获取操作:不允许使用比结构深度“更深”的路径
【问题讨论】:
-
一般来说,遍历和操作树中元素的方式是通过递归。您可以轻松调整列表展平算法(例如 this one)来迭代节点的子节点。
-
感谢关键字“扁平化”。用它在谷歌上搜索很容易:)
标签: python data-structures tree