int Find_Key(Tree T, int val) {
if (T == NULL) return 0;
while (T) {
if (val == T->Key) return 1;
else {
if (val < T->Key) T = T->Left;
else T = T->Right;
}
}
return 0;
}
int LCA(Tree T, int u, int v) {
if (!Find_Key(T, u) || !Find_Key(T, v)) {
return ERROR;
}
if(u==T->Key||v==T->Key) return T->Key;
if (u < v) {
if (u<T->Key && v>T->Key) return T->Key;
else if (u < T->Key && v < T->Key) return LCA(T->Left, u, v);
else if (u > T->Key && v > T->Key) return LCA(T->Right, u, v);
}
else {
if (v<T->Key && u>T->Key) return T->Key;
else if (v < T->Key && u < T->Key) return LCA(T->Left, u, v);
else if (v > T->Key && u > T->Key) return LCA(T->Right, u, v);
}
return ERROR;
}
1.需要一个在二叉搜索树中查找该值是否存在的函数
2.采用递归来实现,1,当二叉搜索树中吗没有u和v时直接返回错误。2当u和v其中一个与根节点的值相等时,直接返回相等的那一个值。3,根据u和v的大小来分类讨论,思路是,如果u和v的值分别大于和小于根节点的值,那么他们两个的公共祖先就是根节点,如果u和v同时大于或小于根节点的值,那么去他们的左或右子树上去寻找公共祖先,由此进行递归。
3.递归思路是先根据第一层即根节点的情况来设立递归的出口,接着假设函数成立来解决k层的问题(即函数本身剩下要解决的问题)