【问题标题】:Understanding Recursion on Tree Traversals了解树遍历的递归
【发布时间】:2014-12-21 13:21:28
【问题描述】:

我试图了解递归的工作原理以及遍历二叉树的工作原理。

好吧,据我所知,递归是在自身内部调用一个函数。有点像循环。

现在我得到了关于如何在二叉树上进行 postOrder 遍历的代码。

(注意这不是我的代码,我只是想通过这段代码了解递归是如何工作的)

 # Definition for a  binary tree node
 # class TreeNode:
 #     def __init__(self, x):
 #         self.val = x
 #         self.left = None
 #         self.right = None

 class Solution:
     # @param root, a tree node
     # @return a list of integers

 def postorderTraversal(self, root):
    solution = []
    self.postorderTraversalRec(root, solution)
    return solution

 def postorderTraversalRec(self, root, solution):
    if root == None:
        return
    self.postorderTraversalRec(root.left, solution)
    self.postorderTraversalRec(root.right, solution)
    solution.append(root.val)

现在据我了解,PostOrder 遍历是right-left-middle,所以先是子级,然后是父级。

这是我认为发生递归的 2 行。

    self.postorderTraversalRec(root.left, solution)
    self.postorderTraversalRec(root.right, solution)

据我了解,第一行告诉程序递归遍历所有左侧节点,直到它到达末尾。然后它告诉程序遍历所有左侧节点直到它到达末尾。

但我面临的问题是,我无法理解这是如何进行 PostOrder 遍历的。对我来说,它看起来像一个 PreOrder 遍历。

【问题讨论】:

    标签: python recursion


    【解决方案1】:

    Post-order traversal如下:

    1. 遍历左子树。
    2. 遍历右子树。
    3. 访问根目录。

    这正是这里发生的事情。对于任何给定的节点(root),首先访问左子树(root.left),然后访问右子树(root.right),然后是节点本身(root.val)。

    traversal-type的“pre”或“post”部分是指访问当前节点的值的时间,可以在访问子节点之前(pre-),之后(post-),甚至在访问之间每个子节点(按顺序遍历)。在您的示例代码中,当前节点的值在遍历子节点后被访问。所以,这是后序遍历。

    【讨论】:

    • 我很困惑..当我们调用递归函数时: self.postorderTraversalRec(root.left, solution) .. 它继续递归地遍历所有左节点......并且一旦所有左节点结束..它通过右手节点...这是我的想法。
    • @Ali 是的,这正是它的作用。您仍在描述后序遍历。
    • 但这与预购有何不同?
    • 在预购中,我们将在递归之前而不是之后附加root.val
    • @Ali:你的函数看起来像:如果是预购递归:def preorderTraversalRec(self, root, solution): if root == None: return solution.append(root.val) self.preorderTraversalRec(root.left, solution) self.preorderTraversalRec(root.right, solution)
    猜你喜欢
    • 1970-01-01
    • 2016-08-24
    • 1970-01-01
    • 2018-07-12
    • 2014-03-11
    • 1970-01-01
    • 2022-11-21
    • 2017-05-11
    • 1970-01-01
    相关资源
    最近更新 更多