剑指 Offer 68 - I. 二叉搜索树的最近公共祖先

题目:

剑指 Offer 68 - I. 二叉搜索树的最近公共祖先
235. 二叉搜索树的最近公共祖先
在这里插入图片描述

题解:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1. 题解一:迭代法

在这里插入图片描述
在这里插入图片描述

2. 题解二:递归法(优选)

在这里插入图片描述

代码:

1. 代码一:迭代法

public class 面试题68_1 {

    // 方法1:迭代
    public static TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        while(root != null) // 当节点 root 为空时跳出
        {
            if(root.val < p.val && root.val < q.val) // p,q 都在 root 的右子树中
            {
                root = root.right; // 遍历至右子节点
            }
            else if(root.val > p.val && root.val > q.val) // p,q 都在 root 的左子树中
            {
                root = root.left; // 遍历至左子节点
            }
            else
            {
                break; // 否则,说明找到了 最近公共祖先 ,跳出。
            }
        }
        return root; // 返回最近公共祖先 root
    }

    public static void main(String[] args) {
        Integer nums[] = { 6, 2, 8, 0, 4, 7, 9, null, null, 3, 5 };
        TreeNode root = ConstructTree.constructTree(nums);
        TreeOperation.show(root);

        System.out.println("***************************************");

        TreeNode p1 = new TreeNode(2);
        TreeNode q1 = new TreeNode(8);
        TreeNode res1 = lowestCommonAncestor(root, p1, q1);
        System.out.println(res1.val);

        System.out.println("***************************************");

        TreeNode p2 = new TreeNode(2);
        TreeNode q2 = new TreeNode(4);
        TreeNode res2 = lowestCommonAncestor(root, p2, q2);
        System.out.println(res2.val);
    }
}

2. 代码二:递归法(优选)

public class 面试题68_1 {

    // 方法2:递归
    public static TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if(root.val < p.val && root.val < q.val)
        {
            return lowestCommonAncestor(root.right, p, q); // 当p,q都比root大时,根据二叉搜索树的性质,则p和q的公共祖先一定在root的右子树上
        }
        if(root.val > p.val && root.val > q.val)
        {
            return lowestCommonAncestor(root.left, p, q); //同理,当p,q都比root小时,则去root的左子树上找。
        }
        // 如果p或q等于root了,则说明这个等于的节点就是公共祖先
        //否则则p和q是在root的两边,则root是公共祖先
        return root;
        // 下面几句可以合并成 return root;
        // if(p.val == root.val)
        // {
        //     return p;
        // }
        // else if(q.val == root.val)
        // {
        //     return q;
        // }
        // else
        // {
        //     return root;
        // }
    }

    public static void main(String[] args) {
        Integer nums[] = { 6, 2, 8, 0, 4, 7, 9, null, null, 3, 5 };
        TreeNode root = ConstructTree.constructTree(nums);
        TreeOperation.show(root);

        System.out.println("***************************************");

        TreeNode p1 = new TreeNode(2);
        TreeNode q1 = new TreeNode(8);
        TreeNode res1 = lowestCommonAncestor(root, p1, q1);
        System.out.println(res1.val);

        System.out.println("***************************************");

        TreeNode p2 = new TreeNode(2);
        TreeNode q2 = new TreeNode(4);
        TreeNode res2 = lowestCommonAncestor(root, p2, q2);
        System.out.println(res2.val);
    }
}

参考:

  1. 面试题68 - I. 二叉搜索树的最近公共祖先(迭代 / 递归,清晰图解)
  2. 非递归算法
  3. 【Java】递归与非递归【两种解法】
  4. 二叉搜索树的最近公共祖先
  5. Java(递归) 三行代码
  6. 【5月第4篇题解】分类讨论 递归
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dev_zyx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值