[英]Python: recursion in finding common ancestor in binary search tree
我一直在Leetcode的Discuss選項卡中查看下面的粘貼代碼,我覺得我不完全理解遞歸。 問題是在二叉搜索樹中找到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 -Liners替代技術
那些if
語句檢查q
和p
是否與root
相同。
首先是if
的含義: p
和q
都小於root,所以它們在左側。 所以, root
不是他們lowestCommonAncestor
。 例如,示例樹中的3
和5
。 他們屬於這種情況。 它們都低於6
,因此它們的共同祖先位於主樹左側的某個位置。 使用lowestCommonAncestor(root.left, p, q)
繼續下一步。
第二:與第一個相同,除了,它們現在在右側。 它們都比root
,所以它們必須在lowestCommonAncestor
某個地方有一個lowestCommonAncestor
的root.right
。
該功能繼續進行,直到存在p
和q
不再在同一側的情況。 在這種情況下, root
是lowestCommonAncestor
。
你從樹的根開始,而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
作為你的共同祖先。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.