Leetcode---236. 二叉樹的最近公共祖先
阿新 • • 發佈:2021-05-09
題目:給定一個二叉樹, 找到該樹中兩個指定節點的最近公共祖先。
百度百科中最近公共祖先的定義為:“對於有根樹 T 的兩個節點 p、q,最近公共祖先表示為一個節點 x,滿足 x 是 p、q 的祖先且 x 的深度儘可能大(一個節點也可以是它自己的祖先)。”
示例 1:
輸入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
輸出:3
解釋:節點 5 和節點 1 的最近公共祖先是節點 3 。
思路:遞迴的思想,遞迴的結束條件是root == p || root == q
具體做法:
- pq 有三種情況。
(1)pq 分佈在兩個子樹
(2)pq在一個子樹
第一種情況進行分析:
針對這種情況,遞迴的作用就是尋找pq,利用root->left和root->right 是否等於p或q 作為遞迴停止條件,找到了就返回root給left和right。
第二種情況:
這種情況下,pq都在一個子樹內,若pq的深度不同,如上圖找5和4 的公共祖先,p和q中有一個必被先找到。此時left和right一個有值,一個為空。則非空的為公共祖先。若pq深度相同,則原理同情況1.
class Solution {
public:
TreeNode* lowestCommonAncestor (TreeNode* root, TreeNode* p, TreeNode* q) {
//遞迴停止條件
if(root == nullptr)
return root;
if(root == p || root == q)
return root;
//遞迴進行查詢
TreeNode* left = lowestCommonAncestor(root->left,p,q);
TreeNode* right = lowestCommonAncestor(root->right, p,q);
//找到pq後進行結果判定
if(left && right)
return root;
return left? left:right;
}
};