Tree 如何使用固定的颜色集为树节点着色?
我有一个员工层次结构树,我想为其应用颜色。我最多只能使用10种颜色,因为更多的颜色会让用户感到困惑。我可以使用什么样的逻辑或算法来用一组颜色给树着色?有没有一些技巧可以做到这一点? 我最初的想法是通过做BFS在树中找到10个子树,然后给它们涂上不同的颜色。如果第一级本身有>10个子级,则不应用任何颜色,如果有<10个节点,则继续向下,直到找到10个子树进行着色。这是看待这个问题的正确方式吗?Tree 如何使用固定的颜色集为树节点着色?,tree,Tree,我有一个员工层次结构树,我想为其应用颜色。我最多只能使用10种颜色,因为更多的颜色会让用户感到困惑。我可以使用什么样的逻辑或算法来用一组颜色给树着色?有没有一些技巧可以做到这一点? 我最初的想法是通过做BFS在树中找到10个子树,然后给它们涂上不同的颜色。如果第一级本身有>10个子级,则不应用任何颜色,如果有
艾米:还有其他想法吗?是否希望每个相邻节点的颜色都不同?父母与孩子不同,兄弟姐妹也不同?用其他随机分配的颜色 旧代码不符合我提出的要求,因此我编写了一个新版本的代码,由于它是迭代的,所以更好。我更满意的是,它符合我上面提到的描述 如果是这样,那么从所有颜色的集合
C
开始,为父节点选择一个,让我们为每个从左到右的子节点调用该集合p
,将它们从集合C-{S,p}
,其中S
是此节点的左同级的颜色。对设置了C-D
的每个子节点重复此操作,其中D是该子节点的颜色,除非您已经选择了节点的颜色
其中大部分仍然正确,但我没有使用深度优先递归,而是切换到迭代级顺序遍历:
import random
class Node(object):
def __init__(self, children):
self.children = children
self.color = None
def __str__(self):
return '<node {}>'.format(self.color) + ' '.join(str(c) for c in self.children) + '</node>'
def pick(s):
return random.choice(list(s))
def assign_colors(node, set_of_colors):
node.color = pick(set_of_colors)
level = [node]
while level:
left_sibling = set()
_level = []
for node in level:
for child in node.children:
_level.append(child)
child.color = pick(set_of_colors - (set([node.color]) | left_sibling))
left_sibling = set([child.color])
level = _level
test = Node([Node([Node([Node([]), Node([]), Node([]), Node([])]),
Node([Node([]), Node([])]), Node([]), Node([])]),
Node([Node([]), Node([]), Node([]), Node([])]), Node([])])
assign_colors(test, set([1,2,3,4]))
print test
assign_colors(test, set([1,2,3,4,5]))
print test
那将是相当于斑马条纹桌子的树。我给这棵斑马纹树起名
<node 3>
<node 4>
<node 2>
<node 4></node>
<node 1></node>
<node 4></node>
<node 1></node>
</node>
<node 1>
<node 4></node>
<node 3></node>
</node>
<node 3></node>
<node 1></node>
</node>
<node 1>
<node 2></node>
<node 3></node>
<node 2></node>
<node 4></node>
</node>
<node 2></node>
</node>
<node 4>
<node 2>
<node 1>
<node 5></node>
<node 4></node>
<node 2></node>
<node 4></node>
</node>
<node 5>
<node 3></node>
<node 2></node>
</node>
<node 4></node>
<node 3></node>
</node>
<node 5>
<node 1></node>
<node 4></node>
<node 2></node>
<node 3></node>
</node>
<node 1></node>
</node>
1
/ | \
2 3 2
/ | \
1 3 1 3
/ | \
3 2 3 2