二叉搜索樹的最近公共祖先
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;
}
};