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

问题

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

解决

//1、两次遍历
class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        TreeNode current=root;
        List p_path=reNodePath(current,p);
        List q_path=reNodePath(current,q);
        TreeNode now=null;
        int len1=Math.min(q_path.size(),p_path.size());
        for(int i=0;i reNodePath(TreeNode root,TreeNode targer){
        List path=new ArrayList();
        while(root!=targer){
            path.add(root);
            if(targer.val

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

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

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

总结:

  • 三种方法都是根据二叉搜索树的性质来,从路径出发找到最终结点。

Original: https://www.cnblogs.com/zhangsanM/p/16567991.html
Author: new_monkey
Title: 算法:二叉搜索树的最近公共祖先

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/605175/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球