给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先;
相比于二叉树,二叉搜索树也可以用二叉树的方法,又因为二叉搜索树的值有大小之分,所以可以通过判断的得大小,向一个方向去查找;
方法一:二叉树的搜索方法;
采用递归的方法,判断p,q是否存在在左孩子和右孩子里;
/**
* 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* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if(!root) return NULL;
if(root==p||root==q)
return root;
TreeNode *_left=lowestCommonAncestor(root->left,p,q);
TreeNode *_right=lowestCommonAncestor(root->right,p,q);
if(_left!=NULL&&_right!=NULL)
return root;
else if(_right!=NULL)
return _right;
else return _left;
return NULL;
}
};
方法二:通过比较值的大小,向一个方向查找;
通过值得大小判断,p,q是否存在在左右子节点中;
/**
* 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* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if(!root) return NULL;
if(root==p||root==q)
return root;
if(root->val<p->val&&root->val<q->val){
return lowestCommonAncestor(root->right,p ,q);
}else if(root->val>p->val&&root->val>q->val){
return lowestCommonAncestor(root->left,p,q);
}else
return root;
}
};