我有一棵树,如下所示。
- 红色表示它具有某种属性,未填充表示它没有它。我想尽量减少
Red
检查。- 如果
Red
所有祖先也是Red
(并且不应再次检查)。 - 如果
Not Red
比所有后代都是Not Red
.
- 如果
- 树的深度为
d
。 - 树的宽度为
n
。 请注意,子节点的值大于父节点。
- 示例:在下面的树中,
- 节点 '0' 有子节点 [1, 2, 3],
- 节点 '1' 有子节点 [2, 3],
- 节点“2”有孩子 [3] 和
- 节点“4”有孩子 [](没有孩子)。
因此,孩子可以构造为:
if vertex.depth > 0: vertex.children = [Vertex(parent=vertex, val=child_val, depth=vertex.depth-1, n=n) for child_val in xrange(self.val+1, n)] else: vertex.children = []
- 示例:在下面的树中,
这是一个示例树:
我正在尝试计算Red
节点数。树的深度和宽度都会很大。所以我想做一种深度优先搜索,另外使用上面的属性 1 和 2。
我如何设计一个算法来遍历那棵树?
PS:我标记了这个 [python] 但任何算法大纲都可以。
更新和背景
- 我想尽量减少财产检查。
- 属性检查正在检查从我的树的路径构造的二分图的连通性。
示例:
- 示例树中左下角的节点的路径= [0, 1]。
- 让二部图有集合
R
和C
大小r
和c
。(注意,树的宽度是n=r*c
)。 - 从路径中,我通过从完整图开始并删除路径中所有值的边 (x, y) 来到达图的边缘,如下所示:
x, y = divmod(value, c)
.
属性检查的两条规则来自于图的连通性: - 如果图是在删除了边 [a, b, c] 的情况下连接的,那么它也必须在删除了 [a, b] 的情况下连接(规则 1)。- 如果图在删除边 [a, b, c] 的情况下断开连接,那么它也必须在删除附加边 d [a, b, c, d] 的情况下断开连接(规则 2)。
更新 2
所以我真正想做的是检查从[0..n]中挑选d个元素的所有组合。树结构有些帮助,但即使我得到了一个最优的树遍历算法,我仍然会检查太多的组合。(我刚才注意到了。)
让我解释。假设我需要检查 [4, 5] (所以 4 和 5 如上所述从二分图中删除,但在这里无关紧要。)。如果它显示为“红色”,我的树将阻止我仅检查 [4]。那很好。但是,我也应该将 [5] 从检查中剔除。
如何更改树的结构(可能是图表?)以进一步减少检查次数?