【问题标题】:Tree traversal recursion树遍历递归
【发布时间】:2017-03-09 02:18:48
【问题描述】:

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

我的树看起来像这样 tree structure

我已经编写了遍历完整树的代码。目前我的遍历将像这样打印完整的树 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]]

【问题讨论】:

  • 提示:想办法从叶子回溯到它的父节点,然后转到另一个叶子等等。
  • 为什么是[A,B,E,F]? F 不是 E 的后代,反之亦然。如果您没有遍历所有可能的从根到叶的路径,您能否详细说明您正在尝试做什么?
  • 谢谢大家,我自己能做到。

标签: python algorithm tree


【解决方案1】:

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

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 的子级。所以我认为这是一个错误。

【讨论】:

    【解决方案2】:

    您基本上想打印从根目录开始的所有路径。您可以通过传递当前路径以递归方式执行此操作。

    基本情况是当遍历到达叶节点时,将叶节点连接到路径并打印或做任何你想做的事情。

    预设代码:

    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)
    

    【讨论】:

      猜你喜欢
      • 2018-07-12
      • 2014-03-11
      • 1970-01-01
      • 2017-05-11
      • 1970-01-01
      • 1970-01-01
      • 2014-12-21
      • 2019-12-01
      相关资源
      最近更新 更多