235. 搜索二叉樹的最近公共祖先

中等 深度優先搜索 二叉搜索樹 二叉樹

思路

利用搜索二叉樹的性質,可以加快找到祖先的速度。 現在給定兩個要找到祖先的節點 p,qp,q ,且 pqp\neq{q} ,搜索從根結點 rootroot 開始。

  • 若現在結點 node\text{node} 的數值 xxp,qp,q 之間,也就是 min(p,q)<x<max(p,q)\min(p,q)<{x}<\max(p,q) , 因為搜索二叉樹的性質, min(p,q)\min(p,q) 會在當前節點的左樹區域, max(p,q)\max(p,q) 會在右樹, node\text{node} 就是祖先。
  • 如果 x<min(p,q)<max(p,q)x<\min(p,q)<\max(p,q) ,所求會在 node\text{node} 的右樹。
  • 如果 min(p,q)<max(p,q)<x\min(p,q)<\max(p,q)<x ,所求會在 node\text{node} 的左側。 如果在找祖先的過程中 node=p,q\text{node} = p, q ,就相當於上一題的情況一:其中一個節點是另一個節點的祖節點。 直接回傳 node\text{node}

程式碼

class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        while(root && root != p && root != q) { // 先判斷節點存在,再判斷是否等於 p, q
            if(min(p->val, q->val) < root->val && root->val < max(p->val, q->val)) { // 數值在兩者之間
                break;
            }
            // 能取代下面註解掉的那一段
            root = root->val < min(p->val, q->val) ? root->right : root->left;
            // if(root->val < min(p->val, q->val)) {
            //     root = root->right;
            // }
            // else if(root->val > max(p->val, q->val)) {
            //     root = root->left;
            // }
        }
        return root; 
    }
};

複雜度分析

  • 時間複雜度:O(n)O(n)
  • 空間複雜度:O(1)O(1)

顯示設定

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