Python:在二叉搜索树中查找共同祖先的递归

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

我一直在看下面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:
        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