生成的深度N的所有可能的树?(Generating all possible trees of de

2019-06-26 11:07发布

我有几个不同类型的树节点,每一个都可以从0到5岁以下儿童的任何地方都有。 我试图找出一种算法来生成深度<= N.这里任何帮助的所有可能的树? 我无法找出如何走递归考虑到一个节点我使每个变化可能使新的子树树(或删除旧的)。

Answer 1:

这里有一个Python程序我写了,我认为做什么你问。 这将返回所有给定的起始节点的可能的树木。 本质上,它归结为与位操作一招:如果一节点具有5个孩子,那么就有2 5 = 32个不同的可能的子树,因为每个子可以独立地存在或者在一个子树中不存在。

码:

#!/usr/bin/env python

def all_combos(choices):
    """
    Given a list of items (a,b,c,...), generates all possible combinations of
    items where one item is taken from a, one from b, one from c, and so on.

    For example, all_combos([[1, 2], ["a", "b", "c"]]) yields:

        [1, "a"]
        [1, "b"]
        [1, "c"]
        [2, "a"]
        [2, "b"]
        [2, "c"]
    """
    if not choices:
        yield []
        return

    for left_choice in choices[0]:
        for right_choices in all_combos(choices[1:]):
            yield [left_choice] + right_choices

class Node:
    def __init__(self, value, children=[]):
        self.value    = value
        self.children = children

    def all_subtrees(self, max_depth):
        yield Node(self.value)

        if max_depth > 0:
            # For each child, get all of its possible sub-trees.
            child_subtrees = [list(self.children[i].all_subtrees(max_depth - 1)) for i in range(len(self.children))]

            # Now for the n children iterate through the 2^n possibilities where
            # each child's subtree is independently present or not present. The
            # i-th child is present if the i-th bit in "bits" is a 1.
            for bits in xrange(1, 2 ** len(self.children)):
                for combos in all_combos([child_subtrees[i] for i in range(len(self.children)) if bits & (1 << i) != 0]):
                    yield Node(self.value, combos)

    def __str__(self):
        """
        Display the node's value, and then its children in brackets if it has any.
        """
        if self.children:
            return "%s %s" % (self.value, self.children)
        else:
            return str(self.value)

    def __repr__(self):
        return str(self)

tree = Node(1,
[
    Node(2),
    Node(3,
    [
        Node(4),
        Node(5),
        Node(6)
    ])
])

for subtree in tree.all_subtrees(2):
    print subtree

下面是测试树的图形表示:

  1
 / \
2   3
   /|\
  4 5 6

下面是从运行程序的输出:

1
1 [2]
1 [3]
1 [3 [4]]
1 [3 [5]]
1 [3 [4, 5]]
1 [3 [6]]
1 [3 [4, 6]]
1 [3 [5, 6]]
1 [3 [4, 5, 6]]
1 [2, 3]
1 [2, 3 [4]]
1 [2, 3 [5]]
1 [2, 3 [4, 5]]
1 [2, 3 [6]]
1 [2, 3 [4, 6]]
1 [2, 3 [5, 6]]
1 [2, 3 [4, 5, 6]]

如果您想我可以翻译成另一种语言这一点。 您没有指定,所以我用Python的; 该代码会更详细一点在Java或C ++或什么,因为我趁着Python的列表内涵的一大途径。



Answer 2:

你可以创建一个包含一个for循环,其添加元素多维数组,并再次调用该函数的功能,直到树完成。 我不能提供的例子,因为我不知道你喜欢哪种语言。



Answer 3:

http://books.google.co.uk/books?id=56LNfE2QGtYC&pg=PA23&lpg=PA23&dq=hansel%27s+algorithm&source=bl&ots=vMbfFj-iZi&sig=E0cI5XhVZ3q1Lg9eAJ_1zYQm53U&hl=en&ei=8udlStuKJ8ehjAfJ1ZSUAQ&sa=X&oi=book_result&ct=result&resnum=1



Answer 4:

如果节点类型之间的唯一差别是孩子的数目,则产生每一个可能的树仅带着孩子也将产生用于具有等于或更少的子节点的任何组合每一个可能的树的最大数量的节点类型。

这是那种拗口的...

换句话说,如果5个孩子是最大的,那么一些可能的树木只取得了5子节点将有有节点,例如,两个实际的孩子,和三个空指针。 这实际上就等于拥有只有两个孩子的节点。



文章来源: Generating all possible trees of depth N?