题目
给定一棵二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义: “对于有根树T
的两个结点u
、v
,最近公共祖先表示一个结点x
,满足x
是u
、v
的祖先且x
的深度尽可能大。”(一个节点也可以是它自己的祖先)
例如,节点5
和节点1
的最近公共祖先是节点3
;节点5
和节点4
的最近公共祖先是节点5
,因为根据定义,一个节点可以是它自己的祖先。
题解
这道题应该是面试常考题。可以考虑直接用两个数组分别记录u
和v
的路径,然后遍历两个路径找公共祖先
代码
/**
* 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 getAncestor(TreeNode* root,TreeNode *p,vector<TreeNode*> &vec){
if(root==NULL) return false;
if(root==p){
vec.push_back(root);
return true;
}
if(getAncestor(root->left,p,vec)||getAncestor(root->right,p,vec)){
vec.push_back(root);
return true;
}
return false;
}
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
vector<TreeNode*> vp,vq;
getAncestor(root,p,vp);
getAncestor(root,q,vq);
int n=vp.size(),m=vq.size();
while(n>0&&m>0&&vp[n-1]==vq[m-1]){
n--;
m--;
}
return vp[n];
}
};