如何理解二叉树中的递归

Posted

技术标签:

【中文标题】如何理解二叉树中的递归【英文标题】:How to understand recursion in Binary Tree 【发布时间】:2021-09-17 06:49:50 【问题描述】:

我已经开始学习递归,我似乎理解了这个概念,但同时我感到完全迷失了。

例如,我试图解决在二叉树中查找给定节点的祖先问题

我的树:

      1
    /   \
   7     9
  / \   / \
 6  5  2   3

我的代码:

def findAns(node,target,ans):
        
    if node is None:
        return ans
    
    ans.append(node.data)
    if node == target:
        return ans[:-1] #return the list except the last item(whch will be the target node)

    ans = findAns(node.left,target,ans)
    
    ans = findAns(node.right,target,ans)

    del ans[-1] #Delete last node while backtracking
    
    
    return ans

ans=[]
findAns(root,target,ans) #target node is 5
print(ans)
print(ans[:-1])

输出:

[1,7,5]

[1, 7]

我无法理解以下问题,

    当整个树的回溯完成时,列表'ans'将是空的@根位置,我为什么能够在我的列表中获得值[1,7,5]?

    当 if 条件满足时,我返回 ans[:-1] ,因为我不应该包含目标节点,但是为什么当我打印 'ans' 时我也得到了目标节点?

    在相同的 'if condition' 中,如果我返回 ans 而不是 ans[:-1],则 y 代码不起作用,我会返回一个空的 'ans' 列表,这是为什么呢?

但是为了避免混淆,我如下所述更改了我的代码,我使用了一个全局变量。但是我认为这不是有效的,任何资源或材料或对我上述问题的解释都会对我有很大帮助。谢谢!

带有全局变量的代码:

_ans=[]
def findAns(node,target,ans):
    global _ans
    
    if node is None:
        return ans
    
    ans.append(node.data)
    if node == target:
        _ans.append(list(ans[:-1]))
        #return ans[:-1]

    ans = findAns(node.left,target,ans)
    
    ans = findAns(node.right,target,ans)

    del ans[-1]
    
    return ans

ans=[]
findAns(root,target,ans)
_ans[0]

【问题讨论】:

【参考方案1】:
    您希望回溯后的根返回空列表,它确实如此。问题是函数返回空列表,但你没有抓住它:
res=findAns(root, target, ans)
print(res)

输出:

[]
    从问题1你可能仍然认为打印ans和获取返回值是一样的,但是当你返回ans[:-1]时你已经丢失了你传入的原始列表。这与python中的list密切相关可变且list[:-1] 将返回一个全新的列表,修改新列表不会影响您第一次传入的ans。因此,在它返回一个新列表后,回溯ans = findAns(root.right, target, ans) 将采用一个新列表,之后更改“新”ans 不会更改“旧”ans(用于打印的那个) 如果您更改为return ans,那么它将打印出空列表。问题是每次迭代递归中的一个步骤时,您都会追加一个新节点,但同时删除最后一个节点,这导致添加一和删除一为零。

【讨论】:

以上是关于如何理解二叉树中的递归的主要内容,如果未能解决你的问题,请参考以下文章

124. 二叉树中的最大路径和。 递归

二叉树递归遍历的白话文讲解

树与二叉树

用于在 JavaScript 中的二叉树中插入节点的递归函数中的错误

二叉树的各种遍历方式,我都帮你总结了,附有队列堆栈图解

温故知新'二叉树中的列表':typescript递归和深度遍历实现