我学会了实现二进制搜索树的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)]
,但它没有用。
所以,我的问题是:
任何方式都可以在inorder函数中完成,即它应该返回一个列表而不仅仅是打印值。
是否有一些通用方法可以使重复函数返回数据结构而不是仅仅输出打印到控制台?
答案 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, [])
快乐编码:)