如何用固定的颜色组对树节点着色?

时间:2015-09-04 02:52:08

标签: tree

我有一个员工层次结构树,我想为其应用颜色。我只能使用最多10种颜色,因为更多颜色会让用户感到困惑。我可以使用什么逻辑或算法用一组颜色为树着色?有一些技巧如何做到这一点? 我最初的想法是通过BFS在树中找到10个子树,然后对它们进行不同的着色。如果第一级本身有> 10个孩子,那么不要应用任何颜色,如果有<然后10个节点继续向下,直到找到10个子树颜色。这是看待这个问题的正确方法吗? 艾米更多的想法?

1 个答案:

答案 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>

那将是斑马条纹表的树。我将此命名为斑马条纹树