1、题目描述
输入一个二叉树,和两个节点。找出两个节点的最低公共祖先。
2、思路
判断两个节点是否存在于二叉树的左子树中。
如果都存在,则在左子树中找祖先;如果都不存在,则在右子树中找;
否则,返回根节点。
3、代码
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if(!root||!p||!q) return root;
if(p->val ==root->val ||q->val==root->val) return root;
bool l1 = in(p,root->left);
bool l2 = in(q,root->left);
if(l1&&l2)
return lowestCommonAncestor(root->left, p,q);
else if(!l1&&!l2)
return lowestCommonAncestor(root->right,p,q);
else
return root;
}
bool in(TreeNode* p, TreeNode* root){
if(!root&&root==p) return true;
else if(!root) return false;
if(root==p) return true;
else
return in(p,root->left)||in(p,root->right);
}
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if(!root||!p||!q) return root;
if(p == root || q == root) return root;
TreeNode* t1 = lowestCommonAncestor(root->left,p,q);
TreeNode* t2 = lowestCommonAncestor(root->right,p,q);
if(t1 && t2)
return root;
return t1?t1:t2;
}