LeetCode每日1题--二叉树搜索树的最近公共祖先

40 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第14天,点击查看活动详情

前言

算法的重要性不言而喻!区分度高!

现在学习的门槛低了,只有能上网每个人都可以学编程!培训班6个月就可以培养出来能干活的人,你怎么从这些人中脱颖而出?没错!就是学算法,学一些底层和基础的东西。

说的功利点是为了竞争,卷死对手。真心话说就是能提高自己的基础能力,为技术可持续发展做好充分的准备!!!

提前入门学习书籍:CPrimerPlus、大话数据结构

image-20220705103735001

刷题网站

代码随想录 (programmercarl.com)

leetcode

我是按照代码随想录提供的刷题顺序进行刷题的,大家也可以去刷leetcode最热200道,都可以

刷题嘛,最重要的就是坚持了!!!

画图软件

OneNote

这个要经常用,遇见不懂的流程的话就拿它画一画!

笔记软件

Typoral

题目

力扣题目链接

解析

这题和上一题很相似,我们好好的利用二叉搜索树的特性去完成题解

也就是二叉搜索树的有序性

递归三部曲

  1. 确定递归的参数和返回值 参数就是根节点和两个不同的节点p、q

public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q){}

  1. 确定递归终止的条件

if (root == null || root == p || root == q) { // 递归结束条件
    return root;
}

  1. 确定单层递归的逻辑
left = 递归函数(root->left);  // 左
right = 递归函数(root->right); // 右
leftright的逻辑处理;         // 中 

搜索一条边的写法:

if (递归函数(root->left)) return ;

if (递归函数(root->right)) return ;

这里要知道找到公共祖先的情况

  1. 如果要查找的值小于根节点的值,那说明两个节点都在左子树
  2. 如果要查找的值大于根节点的值,那说明两个节点都在右子树
  3. 如果都不满足,那根节点一定是祖先节点

我们上一题中还有一个节点既是祖先节点又是子节点情况为啥这里没有呢?

其实第三个判断就已经满足了这种条件,因为从下往上判断的时候,判断的依据就是返回根节点

如果在左子树找到两个子节点的话,它最后判断依据就是返回根节点,所以即使出现一个节点既是祖先节点又是子节点情况的情况,这里还是可以返回成功

如果在右子树找到两个子节点的话,它最后判断依据就是返回根节点,所以即使出现一个节点既是祖先节点又是子节点情况的情况,这里还是可以返回成功


if (root.val > p.val && root.val > q.val) return lowestCommonAncestor(root.left, p, q);

if (root.val < p.val && root.val < q.val) return lowestCommonAncestor(root.right, p, q);

return root;
}

完整代码

class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        //如果要查找的值小于根节点的值,那说明两个节点都在左子树
        if (root.val > p.val && root.val > q.val) return lowestCommonAncestor(root.left, p, q);
        //如果要查找的值大于根节点的值,那说明两个节点都在右子树
        if (root.val < p.val && root.val < q.val) return lowestCommonAncestor(root.right, p, q);
        //如果分散开来,那肯定就是根节点了
        return root;
    }
    }
}