【问题标题】:Inorder Traversal of Tree in Python Returning a ListPython中树的中序遍历返回列表
【发布时间】: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)],但它不起作用。

所以,我的问题是:

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

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

【问题讨论】:

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


    【解决方案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)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多