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中树的中序遍历返回列表的主要内容,如果未能解决你的问题,请参考以下文章