LeetCode每日1题--二叉搜索树的最小绝对差

35 阅读2分钟

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

前言

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

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

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

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

image-20220705103735001

刷题网站

代码随想录 (programmercarl.com)

leetcode

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

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

画图软件

OneNote

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

笔记软件

Typoral

题目

image.png

解析

这题乍一看,没看懂什么意思。其实还是利用搜索二叉树的特性,中序遍历的结果是从小到大排序的。

但是我们没有必要把所有可能的结果都写出来,只需要去中序遍历然后计算两节点的差值即可!

递归三部曲

  1. 确定递归的参数和返回值

题目要求返回的结果是差值,所以返回值是int,然后参数自然是根节点了。

我们用题目给的函数即可

public int getMinimumDifference(TreeNode root) {}

  1. 确定递归终止的条件 当节点为空的话,差值就是0
if(root==null)return 0;
  1. 确定单层递归的逻辑

单层递归的话也是中序对把,只不过在到中序的时候我们进行一个计算,就是拿当前节点的值减去上一个节点的值就是我们得到的一个差值。

那怎么获取最小的差值呢?

我们拿Math类中的min方法即可

getMinimumDifference(root.left);
if(pre!=null){
    result = Math.min(result,root.val-pre.val);
}
pre = root;
//右
getMinimumDifference(root.right);

一图胜千言

还是和上面一样,把代码写在一边,然后去手动模拟递归的变化就可以很轻松的明白题目的含义!

完整代码


class Solution {
    TreeNode pre;// 记录上一个遍历的结点
    int result = Integer.MAX_VALUE;
    public int getMinimumDifference(TreeNode root) {
       if(root==null)return 0;
       getMinimumDifference(root.left);
       if(pre!=null){
            result = Math.min(result,root.val-pre.val);
        }
        pre = root;
        //右
        getMinimumDifference(root.right);
        return result;
    }
}