给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
二叉搜索树的性质:左子树都比当前结点小,右子树都比当前结点大。
① 如果两个节点值都小于根节点,说明他们都在根节点的左子树上,我们往左子树上找。
②如果两个节点值都大于根节点,说明他们都在根节点的右子树上,我们往右子树上找。
③如果一个节点值大于根节点,一个节点值小于根节点,说明他们他们一个在根节点的左子树上一个在根节点的右子树上,那么根节点就是他们的最近公共祖先节点。
对比二叉树那题,显然发现二叉搜索树根据它的性质,使搜索方向非常明确。
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
int mint=min(p->val,q->val);
int maxt=max(p->val,q->val);
while(root){
if(root->val<=maxt&&root->val>=mint){//等于号是因为可能p为q祖先或者q为p祖先
return root;
}
if(root->val<p->val&&root->val<q->val){
root=root->right;
}else{
root=root->left;
}
}
return root;
}