题目:
解析:这道题目需要充分了解二叉搜索树(二叉排序树的性质)
我们会有以下几种情况:
一.u和v某一个在二叉树中不存在
二.u,v在二叉树中存在的情况下
1.u,v比当前根节点都大,此时向右子树递归
2.u,v比当前根节点都小,此时向左子树递归
3.u,v中某一个是当前根节点,此时是递归的一个出口,当前根节点就是最近公共祖先
4.u,v数值分布在当前根节点两侧,此时根据二叉搜索树的性质,当前根节点就是它们的公共祖先。分析:现假设u<旧根<v,此时如果往旧根左边子树递归的话,新根以及其下面所有节点都不可能有大于旧根的值,故不可能在旧根的左边子树找到v。同理,不可能在旧根的右边子树找到u.
解题代码如下:
//此函数用来递归实现普通的查找
int find(Tree T,int u){
if(!T){
return 0;
}
if(u<T->Key){
return find(T->Left,u);
}
else if(u>T->Key){
return find(T->Right,u);
}else{
return 1;
}
}
//此函数在u,v都存在的情况下用递归的方法查找最近公共祖先
int findLCA(Tree T, int u, int v){
if(!T){
return ERROR;
}
if(u==T->Key||v==T->Key){
return T->Key;
}
if(u<T->Key&&v>T->Key||u>T->Key&&v<T->Key){
return T->Key;
}
if(u<T->Key&&v<T->Key){
return findLCA(T->Left,u,v);
}
if(u>T->Key&&v>T->Key){
return findLCA(T->Right,u,v);
}
return ERROR;
}
int LCA( Tree T, int u, int v ){
if(!find(T,u)||!find(T,v)){//u或者v不存在的情况
return ERROR;
}
return findLCA(T,u,v);
}