我有一棵树,如下所示。如何遍历具有特定属性的树
- 红色表示它有一定的属性,未填充表示它没有它。我想尽量减少
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
节点。树的深度和宽度都会很大。所以我想做一种Depth-First-Search,并且使用上面的属性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]断开连接,则它还必须与删除的附加边缘[a,b,c,d](规则2)断开连接。
更新2
所以我真正想要做的是检查采摘d元素出来[0到n]的所有组合。树结构有点帮助,但即使我得到了最佳的树遍历算法,我仍然会检查太多的组合。 (我刚才注意到了。)
让我解释一下。假设我需要检查[4,5](所以4和5从上面解释的二分图中删除,但在这里无关)。如果这出现“红色”,我的树会阻止我仅检查[4]。那很好。但是,我也应该检查[5]。
如何更改我的树的结构(可能是图形)以进一步最小化我的检查次数?
由于节点3,节点1不应该因属性(1)而变为红色,否则节点3因属性(2)而不会变红? – templatetypedef
是的,你是对的。绘制树时我犯了一个错误。将解决。 – Unapiedra
树如何表示?你可以访问任何你想要的节点,或只是根? – templatetypedef