【问题标题】:Can someone explain in-order traversal of binary tree recursion?有人可以解释二叉树递归的顺序遍历吗?
【发布时间】:2021-08-06 11:08:31
【问题描述】:

我有一些代码可以递归地遍历二叉树。

def IN_DFS(node, result=None):
    if result is None:
        result = []
    if not node:
        return result
    Solution.IN_DFS(node.left, result)

    result.append(node.val)

    Solution.IN_DFS(node.right, result)

    return result

我需要一些帮助来了解正在发生的事情。我了解递归,并且知道如何按顺序迭代地遍历二叉树,但似乎看不到这个递归解决方案发生了什么。

所以如果'node'不是None,我们在node.left上调用递归函数直到我们到达一个引导节点,在这种情况下node.left是None,我们移动到下一行'result.append(节点.val)'? - 对吗?

然后在'node.right'上调用递归函数?

假设我们到达第一个node.left叶节点,将其值添加到'result',然后返回到其父节点,将其值添加到'result',然后检查其右子节点?

我不认为上述是正确的 - 任何人都可以帮忙吗?谢谢

【问题讨论】:

    标签: python recursion


    【解决方案1】:
    1. 所以如果'node'不是None,我们在node.left上调用递归函数直到我们到达一个引导节点,在这种情况下node.left是None,我们移动到下一行'result.append(节点.val)'? - 这是正确的吗?- 是的,你就在这里。

    2. 假设我们到达第一个node.left叶节点,将其值添加到'result',然后返回到其父节点,将其值添加到'result',然后检查其右子节点? 不,你移动到右子树(当前节点的右节点)。

    【讨论】:

    • 感谢 Arpit,这是有道理的。还有一件事我不太明白。所以假设我们到达最左边的叶子节点,处理完之后,我们再去node.right,但是父节点本身是什么时候添加的呢?因为父节点总是有子节点,所以在递归中我看不到我们应该在哪里添加 parent.node.val?
    • 当所有的孩子都被遍历完。假设,您有一个添加了左子树的节点,然后程序将回溯到父节点并遍历它的右子树。在右子树内,如果有另一个左子树,则先遍历,以此类推。当所有的(左子树和右子树)都被遍历后,程序回溯到原始节点并添加它。
    • 可以深入了解link
    • 感谢您的解释-我确实了解树是如何遍历的,但我很难看到代码如何实现您提到的遍历。例如,我不明白第一个递归调用——假设我们到达一个叶节点,这意味着下一个节点是空的,所以我们遇到了基本情况,我们将返回“结果”,它是空的?然后调用下一行代码,即附加该叶节点的值。我们从这里去哪里?我理解理论上我们会回到父母然后回到正确的孩子,但是代码是如何实现这一点的呢??
    • 我们将在哪里返回'result',它是空的? - 是的。然后调用下一行代码,即附加该叶节点的值。 - 是的。我们从这里去哪里? - 您转到代码Solution.IN_DFS(node.right, result) 中的下一条语句,即您将节点传递到您刚刚附加到结果中的节点的右侧(比如 RIGHT)。程序再次照常进行。它首先检查 RIGHT.left 的左节点,然后是 RIGHT,然后是 RIGHT.right
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-04
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 2019-08-23
    • 2016-05-01
    相关资源
    最近更新 更多