Python中的树的遍历遍历返回列表

时间:2018-03-02 05:52:02

标签: python algorithm recursion data-structures binary-search-tree

我学会了实现二进制搜索树的inorder遍历:

def inorder(root): # root has val, left and right fields
    if root==None:
        return

    inorder(root.left)
    print(root.val)
    inorder(root.right)

现在,问题是我不想要控制台输出。我想在列表中获取值。我无法找到让函数返回列表的方法。

我试过了s = [inorder(root)],但它没有用。

所以,我的问题是:

  1. 任何方式都可以在inorder函数中完成,即它应该返回一个列表而不仅仅是打印值。

  2. 是否有一些通用方法可以使重复函数返回数据结构而不是仅仅输出打印到控制台?

4 个答案:

答案 0 :(得分:2)

您可以传递一个列表,然后将值附加到它,就像这样 -

def inorder(root,ans): # root has val, left and right fields
    if root==None:
        return

    inorder(root.left)
    ans.append(root.val)
    inorder(root.right)
ans=[]
inorder(root,ans)
print(ans)

回答您的第二个问题

传递数据结构本身是最简单的解决方案。如果你真的希望函数“返回”输出, 一种方法是使用列表连接作为@Shaido建议,但是在每次递归调用时不必要地创建一个新的单例列表,它在内存上会稍微重一些。

更好的解决方案是使用一些静态列表(即只能声明一次的固定列表)。但它不能直接在python中使用,因为python建议通过在类中声明它来实现它。 (A good discussion here

答案 1 :(得分:2)

您可以递归地建立列表。只需将左侧和右侧树中返回的列表与当前节点中的值一起添加。

def inorder(root):
    if root==None:
        return []

    left_list = inorder(root.left)
    right_list = inorder(root.right)
    return left_list + [val] + right_list 

答案 2 :(得分:1)

我前段时间遇到过类似的问题。我想出的一种解决方法是创建一个实用函数,在其中传递列表。递归完成时将填充此列表。

现在,在主函数中,您只需使用根节点和一个空列表作为参数来调用实用程序函数。我希望这会有所帮助。干杯!

def preorderTraversal(self, root: TreeNode) -> List[int]:
        result = []
        self.preorder(root, result)       
        return result
    
def preorder(self, node, arr):
        if not node:
            return
        arr.append(node.val)
        self.preorder(node.left, arr)
        self.preorder(node.right, arr)

答案 3 :(得分:0)

def inorder(root, arr):

    if root is None:
        return
    arr.append(root.val)
    traverse(root.left, arr)
    traverse(root.right,arr)
    return arr


inorder_list = inorder(root, [])

快乐编码:)