LeetCode236. 二叉樹的最近公共祖先(後序遍歷 DFS)

1、題目描述

https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-tree/

相關題:68-1二叉搜索樹的最近公共祖先(劍)LeetCode.235 https://blog.csdn.net/IOT_victor/article/details/104622587

2、代碼詳解

# Definition for a binary tree node.
class TreeNode(object):
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None

class Solution(object):
    def lowestCommonAncestor(self, root, p, q):
        """
        :type root: TreeNode
        :type p: TreeNode
        :type q: TreeNode
        :rtype: TreeNode
        """
        if not root or root == p or root == q:
            return root
        
        # 通過遞歸對二叉樹進行 後序遍歷,當遇到節點 p 或 q 時返回。
        # 從底至頂回溯,當節點 p, q 在節點 root 的異側時,節點 root 即爲最近公共祖先,則向上返回 root 。
        
        left = self.lowestCommonAncestor(root.left, p, q)
        right = self.lowestCommonAncestor(root.right, p, q)
        if not left and not right:
            return  # 1.說明 root 的左 / 右子樹中都不包含 p,q,返回 null
        if not left:
            # 3.p,q 都不在 root 的左子樹中,直接返回 right,具體可分爲兩種情況:
            # p,q 其中一個在 root 的 右子樹 中,此時 right 指向 p(假設爲 p )
            # p,q 兩節點都在 root 的 右子樹 中,此時的 right 指向 最近公共祖先節點
            return right
        if not right:
            return left  # 4.同理3
        return root  # 2. if left and right: 同時不爲空 :說明 p, q 分列在 root 的 異側 (分別在 左 / 右子樹),因此 root 爲最近公共祖先,返回 root

https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-tree/solution/236-er-cha-shu-de-zui-jin-gong-gong-zu-xian-hou-xu/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章