算法:二叉搜索树的最近公共祖先

问题

  • 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
    百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且
    x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

解决

//1、两次遍历
class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        TreeNode current=root;
        List<TreeNode> p_path=reNodePath(current,p);
        List<TreeNode> q_path=reNodePath(current,q);
        TreeNode now=null;
        int len1=Math.min(q_path.size(),p_path.size());
        for(int i=0;i<len1;i++){
            if(p_path.get(i)==q_path.get(i)){
                now=q_path.get(i);
            }
        }
        return now;

    }
    //返回目标结点的路径
    public List<TreeNode> reNodePath(TreeNode root,TreeNode targer){
        List<TreeNode> path=new ArrayList<TreeNode>();
        while(root!=targer){
            path.add(root);
            if(targer.val<root.val){
                root=root.left;
            }else{
                root=root.right;
            }
        }
        path.add(root);
        return path;
    }
}


//2、一次遍历:当便利到目标结点的时候,q、p一定在目标结点的两边
class Solution{
    public TreeNode lowestCommonAncestor(TreeNode root,TreeNode q,TreeNode p){
        TreeNode cur=root;
        while(true){
            if(q.val<cur.val&&p.val<cur.val){
                cur=cur.left;
            }
            else if(q.val>cur.val&&p.val>cur.val){
                cur=cur.right;
            }
            else{
                break;
            }
        }
        return cur;
    }
}



//3、递归
class Solution{
    public TreeNode lowestCommonAncestor(TreeNode root,TreeNode q,TreeNode p){
        if(q.val<root.val&&p.val<root.val) return lowestCommonAncestor(root.left,q,p);
        else if(q.val>root.val&&p.val>root.val) return lowestCommonAncestor(root.right,q,p);
        return root;
    }
}

时间复杂度:O(N)
空间复杂度:O(N)

总结:

  • 三种方法都是根据二叉搜索树的性质来,从路径出发找到最终结点。
posted @   new_monkey  阅读(25)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程
点击右上角即可分享
微信分享提示