題目:
題解:
- 遞歸三部曲,寫好遞歸出口,遞歸式和處理遞歸結果便可得解。
- 首個公共祖先有三種情況:
- 1)p、q爲以 root 爲根節點的左右子樹中,則 root 爲祖先
- 2)p、q在以 root 爲節點的左子樹中,則 root->left 爲祖先(即在右子樹中找不到p、q節點)
- 3)p、q在以 root 爲節點的右子樹中,則 root->right爲祖先(即在左子樹中找不到p、q節點)
代碼如下:
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
//1、遞歸出口:根節點爲空,或者找到p或q節點了
if(!root||root==p||root==q)return root;
//2、遞歸式:從根節點的左右子樹尋找p、q的節點
TreeNode *left=lowestCommonAncestor(root->left,p,q);
TreeNode *right=lowestCommonAncestor(root->right,p,q);
//3、判斷其祖先的位置
if(left&&right)return root;//在以root爲根節點的左右子樹中找到p、q節點了,則root爲祖先
if(left&&!right)return left;//在以root爲根節點的右子樹沒找到p、q節點,則其左子樹根節點爲祖先
return right;////在以root爲根節點的左子樹沒找到p、q節點,則其右子樹根節點爲祖先
}
};