二叉搜索树的最近公共祖先
BST的性质(定义):
①左子树的节点的值都比根节点值小。
②右子树的节点的值都比根节点值大。
③左子树、右子树都是BST。
所以,
假如p、q的值都比根节点的值要小,说明这个根节点还不是最近的,它的左子树的根可能更近。
假如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) {
int rv = root->val;
int pv = p->val;
int qv = q->val;
if(pv>rv && qv>rv){
return lowestCommonAncestor(root->right,p,q);
}else if(pv<rv && qv<rv){
return lowestCommonAncestor(root->left,p,q);
}else{
return root;
}
}
};
迭代实现:
/**
* 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) {
int pv = p->val;
int qv = q->val;
while(root){
int rv = root->val;
if(pv>rv && qv>rv){
root = root->right;
}else if(pv<rv && qv<rv){
root = root->left;
}else{
return root;
}
}
return nullptr;
}
};