二叉树的最近公共祖先
1.搜索二叉树
解题思路:由于为搜索二叉树,所以判断所给节点的值与根节点值大小的比较,如果p大于根节点,q小于根节点,那么根节点必定为公共祖先.如果都小于则在root->left中继续遍历都大于在root->right中遍历
。
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if(p == root||q == root)
return root;
if((p->val<root->val&&q->val>root->val)||(q->val<root->val&&p->val>root->val))
return root;
else if(p->val<root->val&&q->val<root->val)
return lowestCommonAncestor(root->left, p, q);
else
return lowestCommonAncestor(root->right, p, q);
}
};
2.普通二叉树(无序二叉树)
解题思路:先判断给定节点是否为根节点如果是则直接返回根节点
然后分别在左树和右树中进行遍历
因为给的的节点必定存在而且唯一,所以如果左树遍历不为空,则右树中可能有也可能没有,所以分情况继续讨论。
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if(root == nullptr)
return nullptr;
if(p == root|| q == root)
return root;
TreeNode* left = lowestCommonAncestor(root->left,p,q);
TreeNode* right = lowestCommonAncestor(root->right,p,q);
if(left!=nullptr && right!=nullptr)
return root;
else if(left!=nullptr)
return left;
else if(right!=nullptr)
return right;
else
return nullptr;
}
};