二叉搜索树最近公共祖先

题目:

解析:这道题目需要充分了解二叉搜索树(二叉排序树的性质)

        我们会有以下几种情况:

        一.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);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值