簡體   English   中英

Python:在二叉搜索樹中查找共同祖先的遞歸

[英]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函數(像pq這樣的參數),但遞歸調用只接受root.leftroot.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語句檢查qp是否與root相同。

首先是if的含義: pq都小於root,所以它們在左側。 所以, root不是他們lowestCommonAncestor 例如,示例樹中的35 他們屬於這種情況。 它們都低於6 ,因此它們的共同祖先位於主樹左側的某個位置。 使用lowestCommonAncestor(root.left, p, q)繼續下一步。

第二:與第一個相同,除了,它們現在在右側。 它們都比root ,所以它們必須在lowestCommonAncestor某個地方有一個lowestCommonAncestorroot.right

該功能繼續進行,直到存在pq不再在同一側的情況。 在這種情況下, rootlowestCommonAncestor

你從樹的根開始,而pq是你想要得到它們共同祖先的節點。

例如,當p是節點3時, q是節點5. root是6。

所以p.val < root.val > q.val將保持,現在你將調用self.lowestCommonAncestor(root.left, p, q) 您只是在函數之間移動對象的引用。

現在你的根將是2 (根的左邊),而pq是相同的。 現在, if p.val > root.val < q.val將保持,因為3 > 25 > 2 ,所以我們將調用self.lowestCommonAncestor(root.right, p, q) 當我們將參數root.right ,這只是對不同對象的引用。 只是為了澄清,這不會改變任何對象的值,但它會改變當前函數范圍內的root值。

現在你的根將是4 ,並且沒有任何條件成立,所以你將返回4作為你的共同祖先。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM