如何理解二叉树中的递归
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
,那么它将打印出空列表。问题是每次迭代递归中的一个步骤时,您都会追加一个新节点,但同时删除最后一个节点,这导致添加一和删除一为零。
【讨论】:
以上是关于如何理解二叉树中的递归的主要内容,如果未能解决你的问题,请参考以下文章