Tree 如何使用固定的颜色集为树节点着色?

Tree 如何使用固定的颜色集为树节点着色?,tree,Tree,我有一个员工层次结构树,我想为其应用颜色。我最多只能使用10种颜色,因为更多的颜色会让用户感到困惑。我可以使用什么样的逻辑或算法来用一组颜色给树着色?有没有一些技巧可以做到这一点? 我最初的想法是通过做BFS在树中找到10个子树,然后给它们涂上不同的颜色。如果第一级本身有>10个子级,则不应用任何颜色,如果有

我有一个员工层次结构树,我想为其应用颜色。我最多只能使用10种颜色,因为更多的颜色会让用户感到困惑。我可以使用什么样的逻辑或算法来用一组颜色给树着色?有没有一些技巧可以做到这一点? 我最初的想法是通过做BFS在树中找到10个子树,然后给它们涂上不同的颜色。如果第一级本身有>10个子级,则不应用任何颜色,如果有<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