235. 二叉搜索树的最近公共祖先
思路:dfs来进行查找。细节看注释
/**
* 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 * dfs(TreeNode* root, TreeNode* p, TreeNode* q){
//当前为空,就返回空
if(root==nullptr) return nullptr;
//如果有一个相等就直接返回当前的指针,即使p、q其中一个是最近公共祖先也是成立的。
if(root==p||root==q) return root;
//查找左边
TreeNode * tmp1=dfs(root->left,p,q);
//查找右边
TreeNode * tmp2= dfs(root->right,p,q);
//下面两行是,p、q在同一边的时候,一定有一边返回空,那我们返回另外一边非空的即可
if(tmp1==nullptr&&tmp2!=nullptr) return tmp2;
if(tmp1!=nullptr&&tmp2==nullptr) return tmp1;
//如果两边都非空,且返回的指针不相等,那就说明当前的根节点才是最近的公共祖先
if(tmp1!=tmp2) return root;
return tmp1;
}
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
return dfs(root,p,q);
}
};