LeetCode算法题-Lowest Common Ancestor of a Binary Search Tree

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> LeetCode算法题-Lowest Common Ancestor of a Binary Search Tree

这是悦乐书的第197次更新,第203篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第59题(顺位题号是235)。给定二叉搜索树(BST),找到BST中两个给定节点的最低共同祖先(LCA)。根据维基百科上LCA的定义:“最低共同祖先在两个节点p和q之间定义为T中的最低节点,其中p和q都是后代(我们允许节点成为其自身的后代)。”

给定二叉搜索树:root = [6,2,8,0,4,7,9,null,null,3,5]


            6
          /   
         2     8
        /    / 
        0  4  7  9
          / 
         3   5

例如:

输入:root = [6,2,8,0,4,7,9,null,null,3,5],p = 2,q = 8

输出:6

说明:节点2和8的LCA为6。

输入:root = [6,2,8,0,4,7,9,null,null,3,5],p = 2,q = 4

输出:2

说明:节点2和4的LCA是2,因为节点可以是其自身的后代,根据LCA的定义。

注意:

  • 所有节点的值都是唯一的。
  • p和q不同,两个值都将存在于BST中。
  • 本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

    02 第一种解法

    利用迭代的方法。二叉搜索树的特点是 左节点的值 根节点的值 右节点的值,如果p和q的节点值都小于当前节点,此时指针应该移动到当前节点的左节点,再去比较。如果p和q的节点值都大于当前节点,此时指针应该移动到当前节点的右节点,再去比较。否则就返回当前节点。

    
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        while (root != null) {
            if (p.val  root.val && q.val  root.val) {
                root = root.left;
            } else if (p.val  root.val && q.val  root.val) {
                root = root.right;
            } else {
                return root;
            }
        }
        return root;
    }
    

    03 第二种解法

    利用递归的方法,判断逻辑和迭代的解法一样。如果当前节点的值比p和q中最大值都要大,因为当前节点的左子节点值肯定小于当前节点的值,所以要往当前节点的左子节点方向移动。如果当前节点的值比p和q中最小值都要小,因为当前节点的右子节点值肯定大于当前节点的值,所以要往当前节点的右子节点方向移动。然后再去判断。

    
    public TreeNode lowestCommonAncestor2(TreeNode root, TreeNode p, TreeNode q) {
        if (root == null) {
            return null;
        }
        if (root.val  Math.max(p.val, q.val)) {
            return lowestCommonAncestor2(root.left, p, q);
        }
        if (root.val  Math.min(p.val, q.val)) {
            return lowestCommonAncestor2(root.right, p, q);
        }
        return root;
    }
    

    04 小结

    算法专题目前已连续日更超过一个月,算法题文章59+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

    以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

    LeetCode算法题-Lowest Common Ancestor of a Binary Search Tree

    可能你还想看:

    LeetCode算法题-Lowest Common Ancestor of a Binary Search Tree

    原文始发于微信公众号( 悦乐书 ):

    本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

    本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

    原文链接:blog.ouyangsihai.cn >> LeetCode算法题-Lowest Common Ancestor of a Binary Search Tree


     上一篇
    LeetCode算法题-Delete Node in a Linked List LeetCode算法题-Delete Node in a Linked List
    这是悦乐书的第197次更新,第204篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第60题(顺位题号是235)。编写一个函数来删除单链表中的节点(尾部除外),只允许访问该节点。例如: 鉴于链表 -  
    2021-04-05
    下一篇 
    LeetCode算法题-Valid Anagram LeetCode算法题-Valid Anagram
    这是悦乐书的第198次更新,第205篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第61题(顺位题号是242)。给定两个字符串s和t,写一个函数来确定t是否是s的anagram。例如: 输入:s &#
    2021-04-05