236. 二叉樹的最近公共祖先

中等 深度優先搜索 二叉樹

思路

題目的要找到兩個節點的「最近共同祖先」,以右圖為例,

  1. [2,5]的共同祖先是 2。
  2. [4,5]的共同祖先是 2,
  3. [2,7]的共同祖先是 1。 以下假設要找 p,qp,q 的共同祖先,則可以分為兩種情況

圖片

第一種情況:其中一個節點是另一個節點的祖節點,此時回傳祖節點。
第二種情況:兩個節點沒有祖孫之分,而是有一個共同祖先。
遞迴搜索時,假如遇到 pp 或是 qq ,就將找到的 ppqq 往上傳。
為了滿足第一種情況,在搜索時如果自身就是 ppqq ,優先傳回自己。
在左右都有傳回答案時,此時自己是滿足條件的祖先,也傳回自己。

圖片 情況一

圖片 情況二

程式碼

class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* node, TreeNode* p, TreeNode* q) {        
        if(!node || node == p || node == q) return node;
        TreeNode* left = lowestCommonAncestor(node->left, p, q);
        TreeNode* right = lowestCommonAncestor(node->right, p, q);
        if(!left && !right) return nullptr; // 都沒有找到, 把空往上傳
        if(left && right) return node; // 左邊有找到, 右邊也有找到, 自己就是祖先
        // 現在只有一個是空的, 返回不是空的那一邊
        return !left ? right : left;
    }
};

複雜度分析

  • 時間複雜度:O(n)O(n)
  • 空間複雜度:棧空間 O(logn)O(\log{n})

顯示設定

背景線條
顯示背景網格線條
懸停發光
滑鼠懸停時顯示霓虹效果
聚光燈
跟隨滑鼠的聚光燈效果
背景透明度
開啟透明玻璃效果
主題顏色
自訂主要顏色