我有一个员工层次结构树,我想为其应用颜色。我只能使用最多10种颜色,因为更多颜色会让用户感到困惑。我可以使用什么逻辑或算法用一组颜色为树着色?有一些技巧如何做到这一点? 我最初的想法是通过BFS在树中找到10个子树,然后对它们进行不同的着色。如果第一级本身有> 10个孩子,那么不要应用任何颜色,如果有<然后10个节点继续向下,直到找到10个子树颜色。这是看待这个问题的正确方法吗? 艾米更多的想法?
答案 0 :(得分:1)
您希望每个相邻节点都是不同的颜色吗?父母不同于他们所有的孩子和兄弟姐妹彼此不同?随机分配颜色?
旧代码不符合我的要求,因此我编写了一个新版本的代码,因为它是迭代的更好。而且我更满意的是它符合我上面所述的描述。
如果是这样,那么从所有颜色的集合
C
开始,为父亲选择一个,让我们为每个从左到右的孩子调用一个P
,将它们从集合中{ {1}}其中C - {S,P}
是此节点左侧兄弟的颜色。对具有集合S
的每个子节点重复此操作,其中D是此子节点的颜色,但您已经选择了节点的颜色。
大部分仍然是正确的,但我没有深度第一次递归,而是切换到迭代级别顺序遍历:
C - 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
任何树都可以用最多3种颜色着色(更多只是使它更加丰富多彩)。考虑:
<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>
那将是斑马条纹表的树。我将此命名为斑马条纹树。