我一直在Leetcode的"讨论"选项卡中查看下面粘贴的代码,我觉得我不完全理解递归。 问题是关于在二叉搜索树中找到 2 个节点的共同祖先。
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
可以向我解释如何更改root
以便在不更新其值的情况下给出答案吗?我看到root
被传递到 main 函数中(像p
和q
这样的参数(,但递归调用只需要root.left
和root.right
。
你能用找到 3 和 5 的共同祖先的解释来澄清递归吗?
_______6______
/
___2__ ___8__
/ /
0 _4 7 9
/
3 5
Stackoverflow在这里接受的答案使用递归,但没有回答我的问题。
我在哪里找到代码:https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-search-tree/discuss/64963/3-lines-with-O(1(-space-1-linerers-Alternatives
你从树的根开始,p
和q
是你想要获得它们共同祖先的节点。
例如,当p
是节点 3,q
是节点 5 时。root
为 6。
所以p.val < root.val > q.val
会成立,现在你会打电话给self.lowestCommonAncestor(root.left, p, q)
. 您只是在函数之间移动对象的引用。
现在你的根将是2
(根的左边(,p
和q
是一样的。现在,if p.val > root.val < q.val
会成立,因为3 > 2
和5 > 2
,所以我们称self.lowestCommonAncestor(root.right, p, q)
.当我们把参数放在root.right
,这只是对不同对象的引用。澄清一下,这不会更改任何对象的值,但会更改当前函数范围内的root
值。
现在你的根将被4
,并且没有任何条件会成立,所以你将返回4
作为你的共同祖先。
这些if
语句检查q
和p
在root
方面是否在同一边。
首先if
的意思:p
和q
都比根小,所以它们在左侧。所以,root
不是他们的lowestCommonAncestor
.例如,3
和5
在示例树中。他们属于这种情况。牠们都比6
低,所以牠们的共同祖先在主树的左边。使用lowestCommonAncestor(root.left, p, q)
继续执行下一步。
第二:与第一个相同,除了它们现在在右侧。它们都大于root
,所以它们必须在root.right
的某个地方有一个lowestCommonAncestor
。
此功能一直持续到p
和q
不再在同一侧的情况。在这种情况下,root
是lowestCommonAncestor
。