NC102 在二叉树中找到两个节点的最近公共祖先
递归写法
class Solution {
public:
/**
*
* @param root TreeNode类
* @param o1 int整型
* @param o2 int整型
* @return int整型
*/
TreeNode *find(TreeNode *root,int o1,int o2)
{
if(root==NULL) return NULL;
if(root->val==o1||root->val==o2) return root;
TreeNode *left=find(root->left,o1,o2);
TreeNode *right=find(root->right,o1,o2);
if(left&&right) return root;
else if(left==NULL) return right;
else return left;
}
int lowestCommonAncestor(TreeNode* root, int o1, int o2) {
// write code here
TreeNode *t= find(root,o1,o2);
if(t) return t->val;
else return -1;
}
};
非递归写法
class Solution {
public:
map<int ,int>mp;
void dfs(TreeNode *root,TreeNode *father)
{
mp[root->val]=father->val;
if(root->left) dfs(root->left,root);
if(root->right) dfs(root->right,root);
}
int lowestCommonAncestor(TreeNode* root, int o1, int o2) {
if(root==NULL) return NULL;
TreeNode *zu=new TreeNode(-1000000);
dfs(root,zu);
map<int,int> mp1;
while(o1!=-1000000)
{
mp1[o1]=1;
o1=mp[o1];
}
while(o2!=-1000000)
{
if(mp1[o2]) return o2;
o2=mp[o2];
}
return 0;
}
};