题解 | #二叉搜索树的最近公共祖先#
二叉搜索树的最近公共祖先
https://www.nowcoder.com/practice/d9820119321945f588ed6a26f0a6991f
W
按照图中的来进行递归,流程是遇到所需节点就立马返回,这样就得到所需要的节点
后序查看返回值,根据返回值的情况来判断是那种情况,如果不是由要找的节点返回来,那么就是从叶子节点返回来的
N
判断后序节点是否为空,都为空需要返回空
由于该题为二叉搜索树,所以可以直接递归
判断当前节点是在区间的左边还是右边,左边返回left,右边返回right,如果是中间直接返回即可,注意如果是要找的节点也需要返回
如下图所示寻找0和3的公共祖先,那么7大于二者,就需要往左子树寻找,然后到1,正好在二者中间,返回判断不为空,那么公共祖先为1这个节点
/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* };
*/
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param root TreeNode类
* @param p int整型
* @param q int整型
* @return int整型
*/
TreeNode* Tra(TreeNode* root,int p,int q){
if(root == nullptr){
return nullptr;
}
if(root->val==p || root->val==q){
return root;
}
TreeNode* left=Tra(root->left,p,q);
TreeNode* right=Tra(root->right,p,q);
if(left && right) return root;//note 返回节点
else if(left!= nullptr && !right){//右为空,左有值
return left;
}
else if(right!=nullptr && !left){
return right;
}
else //都为空 note
return nullptr;
}
TreeNode* Tra_search(TreeNode* root,int p,int q)
{
if(root==nullptr) return root;
//二叉搜索树
if(root->val > p && root->val >q) //find in left tree
{
TreeNode* left=Tra_search(root->left,p,q);
if(left!=nullptr){
return left;
}
}
if(root->val < p && root->val <q) //find in left tree
{
TreeNode* right=Tra_search(root->right,p,q);
if(right!=nullptr){
return right;
}
}
return root;//在两者中间,或者就是要找的节点
}
int lowestCommonAncestor(TreeNode* root, int p, int q) {
// write code here
TreeNode* res=Tra_search(root,p,q);//Tra(root,p,q);
if(!res)
return -1;
return res->val;
}
};


途虎成长空间 180人发布