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

Posted

技术标签:

【中文标题】Python中树的中序遍历返回列表【英文标题】:Inorder Traversal of Tree in Python Returning a List 【发布时间】:2018-08-10 08:04:13 【问题描述】:

我学会了实现二叉搜索树的中序遍历:

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)],但它不起作用。

所以,我的问题是:

    这可以在 inorder 函数内部完成,即它应该返回一个列表,而不仅仅是打印值。

    是否有一些通用的方法可以使递归函数返回数据结构,而不仅仅是将打印输出到控制台?

【问题讨论】:

【参考方案1】:

您可以递归地构建列表。只需将左右树返回的列表与当前节点中的值相加即可。

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

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

【讨论】:

【参考方案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)

【讨论】:

【参考方案3】:
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, [])

快乐编码:)

【讨论】:

欢迎来到 Stack Overflow!仅代码的答案并不是特别有用。请简要说明此代码如何解决问题。 能否请您分享有关您的答案的更多详细信息,以使其易于理解或如何解决问题...【参考方案4】:

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

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

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)

【讨论】:

以上是关于Python中树的中序遍历返回列表的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode94——二叉树的中序遍历(python)

LeetCode94——二叉树的中序遍历(python)

二叉树的中序遍历

Leetcode刷题Python94. 二叉树的中序遍历

#yyds干货盘点# 面试必刷TOP101:二叉树的中序遍历

LintCode 二叉树的中序遍历