树遍历递归

时间:2017-03-08 17:24:51

标签: python algorithm tree

我是编程新手。我正在研究我的树项目

我的树看起来像这样 tree structure

我编写了遍历整个树的代码。目前我的traversel会像这样打印完整的树 A,B,E,F,C,d,G,H,I,J,K

def tree_traversal(self, node):
    if(node != None):
      print node.name
      for child_nodes in node.children:
          self.tree_traversal(child_nodes)

但是我想得到这样的输出。

[[A,B,E],[A,B,F],[A,C],[A,D,G,H],[A,D,G,I],[A,D,G,J],[A,D,G,K]]

2 个答案:

答案 0 :(得分:3)

您基本上想要从根打印所有路径。您可以通过传递当前路径来递归执行此操作。

基本情况将是遍历命中叶节点,将叶节点连接到路径并打印或执行任何操作。

presudo代码:

def traverse(node, path):
    if node is None:
        return
    if node.left == None and node.right == None:
        doStuff(path + node.data)
        return
    else:
        traverse(node.left, path + node.data)
        traverse(node.right, path + node.data)

答案 1 :(得分:2)

由于你没有给出任何树/节点类,我用一个来测试:

class Node:
    def __init__(self, data, children=None):
        if children is None:
            children = []
        self.data = data
        self.children = children

    def __str__(self):
        return str(self.data)

    __repr__ = __str__

从您的图片中提取的树:

tree = Node("A", [
    Node("B", [
        Node("E"),
        Node("F"),
    ]),
    Node("C"),
    Node("D", [
        Node("G", [
            Node("H"),
            Node("I"),
            Node("J"),
            Node("K"),
        ])
    ])
])

你想要的是一种能够获得所有可能的根到叶子路径的算法。

def get_all_paths(node, path=None):
    paths = []
    if path is None:
        path = []
    path.append(node)
    if node.children:
        for child in node.children:
            paths.extend(get_all_paths(child, path[:]))
    else:
        paths.append(path)
    return paths

测试它会产生您希望的输出:

paths = get_all_paths(tree)
print(paths)
# Prints:
# [[A, B, E], [A, B, F], [A, C], [A, D, G, H], [A, D, G, I], [A, D, G, J], [A, D, G, K]]

但请注意,[A,B,E,F]不是有效路径,因为F不是E的孩子。所以我认为这是一个错误。