簡要題解:
遞歸解法找到兩個節點分別是在左子樹還是在右子樹中 要是分別在左右子樹中根節點即爲最近公共祖先要是都在左子樹即是遞歸返回來左節點爲最近公共祖先節點,要是都在右子樹跟其一致。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if(root==NULL)return NULL;
if(root==p||root==q)
{
return root;
}
TreeNode* left=lowestCommonAncestor(root->left,p,q);
TreeNode* right=lowestCommonAncestor(root->right,p,q);
if(left!=NULL&&right!=NULL) return root;
if(left!=NULL) return left;
if(right!=NULL)return right;
return NULL;
}
};
非遞歸解法
找到兩個節點的簡單路徑後直接比較兩個節點的路徑即可
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
bool dfs(TreeNode* root,TreeNode *m,vector<TreeNode*>&pa)
{
if(root==NULL) return false;
pa.push_back(root);
if(root==m) return true;
bool flag=true;
flag=dfs(root->left,m,pa);
if(!flag)
flag=dfs(root->right,m,pa);
if(!flag)
pa.pop_back();
return flag;
}
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
vector<TreeNode* >p1;
vector<TreeNode* >p2;
dfs(root,p,p1);
dfs(root,q,p2);
TreeNode* ans=root;
for(int i=0;i<min(p1.size(),p2.size());i++)
{
if(p1[i]==p2[i])
{
ans=p1[i];
} else break;
}
return ans;
}
};