Python:在二叉搜索树中查找共同祖先的递归
我一直在看下面Leetcode讨论选项卡中粘贴的代码,我觉得我不完全理解递归。问题是在二叉搜索树中查找两个节点的共同祖先Python:在二叉搜索树中查找共同祖先的递归,python,python-3.x,recursion,Python,Python 3.x,Recursion,我一直在看下面Leetcode讨论选项卡中粘贴的代码,我觉得我不完全理解递归。问题是在二叉搜索树中查找两个节点的共同祖先 def lowestCommonAncestor(self, root, p, q): if p.val < root.val > q.val: return self.lowestCommonAncestor(root.left, p, q) if p.val > root.val < q.val: r
def lowestCommonAncestor(self, root, p, q):
if p.val < root.val > q.val:
return self.lowestCommonAncestor(root.left, p, q)
if p.val > root.val < q.val:
return self.lowestCommonAncestor(root.right, p, q)
return root
Stackoverflow接受的答案使用递归,但不回答我的问题
我找到代码的地方:那些
if
语句检查q
和p
是否与根在同一侧
首先,if
的意思是:p
和q
都小于根,所以它们在左边。因此,根
不是它们的最低共同祖先
。例如,示例树中的3
和5
。他们属于这种情况。它们都低于6
,因此它们的共同祖先位于主树的左侧。使用最低公共祖先(root.left,p,q)
继续下一步
第二:和第一个一样,只是他们现在在右边。它们都大于root
,因此它们必须在root.right
中的某个位置具有最低的公共祖先
此函数继续执行,直到出现以下情况,p
和q
不再位于同一侧。在这种情况下,root
是从树的根开始的最下面的公共祖先,而p
和q
是要获取其公共祖先的节点
例如,当p
是节点3,而q
是节点5时。根目录是6
因此p.valq.val
将保持不变,现在您将调用self.lowercommon祖先(root.left,p,q)
。您只是在函数之间移动对象的引用
现在,您的根将是2
(根的左侧),并且p
和q
是相同的。现在,如果p.val>root.val
将保持不变,因为3>2
和5>2
,所以我们将调用self.lowercommon祖先(root.right,p,q)
。当我们将参数置于root.right
时,这只是对不同对象的引用。只是澄清一下,这不会更改任何对象的值,但会更改当前函数范围内root
的值
现在,您的根将是4
,并且所有条件都不成立,因此您将返回4
作为您的共同祖先。如果我传递引用,那么root
如何不是6
(如果根未更改)而是4
?我认为root
没有更改,所以我希望6
,但是返回的值是4
。每个对象的值都没有更改,但是当您将root.left
作为参数传递给函数时,您将引用传递给root.left
,然后,新函数中的根
将是上一个根的根。左
。每个函数调用中的根
都会不同。我想我明白了。当根值不在p
和q
的值之间时,可以继续调用该函数。当您到达它所在的位置时,您返回特定函数调用的根值[因为您跳过了if
语句]。返回的值被中继回发起递归的主函数调用,因为第一个主调用有一个return
语句,它返回该值,而没有到达最后一个return root
语句,所以root
保持不变[6
]但是返回的值是满足条件的节点的值,即4
。Yilmaz,这个过程是有意义的,但是没有意义的是root
的返回值是4
而不是6
如果root
值没有显式更新。root
不是保持不变的。继续执行新函数时,新的根目录是root.left
或root.right
。您可以通过在函数的第一行添加打印(“root:+root)
来查看它。
_______6______
/ \
___2__ ___8__
/ \ / \
0 _4 7 9
/ \
3 5