从小白开始刷算法 dfs篇 leetcode.938

简介: 从小白开始刷算法 dfs篇 leetcode.938

序言

虽然算法很难,但不应该就放弃。这是一个学习笔记,希望你们喜欢~

先自己尝试写,大概十几分钟仍然写不出来

看思路,再尝试跟着思路写

仍然写不出来,再看视频

b站up视频推荐:爱学习的饲养员

leetcode其他文章:

数组篇:

从小白开始刷算法 数组篇 leetcode.485

从小白开始刷算法 数组篇 leetcode.283

从小白开始刷算法 数组篇 leetcode.27

链表篇:

从小白开始刷算法 ListNode 链表篇 leetcode.203

从小白开始刷算法 ListNode 链表篇 leetcode.206

队列篇

从小白开始刷算法 ListNode 链表篇 leetcode.933

栈篇

从小白开始刷算法 Stack 栈篇 leetcode.20

从小白开始刷算法 Stack 栈篇 leetcode.496

哈希篇

从小白开始刷算法 Hash 哈希篇 leetcode.217

从小白开始刷算法 Hash 哈希篇 leetcode.705

树篇

从小白开始刷算法 Tree 树篇 先序遍历 leetcode.144

从小白开始刷算法 Tree 树篇 中序遍历 leetcode.94

从小白开始刷算法 Tree 树篇 后序遍历 leetcode.94

堆篇

从小白开始刷算法 Heap 堆篇 最大堆排序 leetcode.215

小白开始刷算法 Heap 堆篇 最小堆排序 leetcode.692

双指针篇

从小白开始刷算法 对撞双指针 leetcode.881

从小白开始刷算法 快慢双指针篇 leetcode.141

二分法篇

从小白开始刷算法 二分法篇 leetcode.704

从小白开始刷算法 二分法篇 leetcode.35

从小白开始刷算法 二分法篇 leetcode.162

从小白开始刷算法 二分法篇 leetcode.74

滑动窗口篇

从小白开始刷算法 滑动窗口篇 leetcode.209

从小白开始刷算法 滑动窗口篇 leetcode.1456

递归篇

从小白开始刷算法 递归篇 leetcode.509

从小白开始刷算法 递归篇 leetcode.206

分治法篇

从小白开始刷算法 分治法篇 leetcode.169

从小白开始刷算法 分治法篇 leetcode.53

回溯法篇

从小白开始刷算法 回溯法篇 leetcode.22

从小白开始刷算法 回溯法篇 leetcode.78

dfs篇

难度:简单

题目:

938. 二叉搜索树的范围和

给定二叉搜索树的根结点 root,返回值位于范围 [low, high] 之间的所有结点的值的和。

示例 1:

输入:root = [10,5,15,3,7,null,18], low = 7, high = 15

输出:32

示例 2:

输入:root = [10,5,15,3,7,13,18,1,null,6], low = 6, high = 10

输出:23

题目来源:力扣(LeetCode)

dfs思路

能否写出:能写出。

时间:30分钟多

思路:

  1. 调用dfs函数,并传入根节点root、区间的下界low、上界high和结果数组res
  2. dfs函数中,首先进行终止条件判断,如果当前节点为空,直接返回。
  3. 接着判断当前节点的值是否在给定区间内,如果是,则将其值加到结果数组res中。
  4. 递归地调用dfs函数遍历当前节点的左子树,即dfs(root.left, low, high, result)
  5. 递归完最左边的节点后,再递归地调用dfs函数遍历当前节点的右子树,即dfs(root.right, low, high, result)

通过递归地遍历二叉搜索树的节点,并判断节点的值是否在给定的区间内。

如果满足条件,则将节点的值累加到结果数组中。最终返回结果数组中累加的和。

注意,为了在递归过程中能够更新结果数组res,需要将结果数组res声明为一个长度为1的数组,并传递给递归函数。

这样在递归过程中可以修改数组中的值,从而在递归结束后得到最终的结果。

第一版:

// 仅是我的思路代码,leetcode上大神更厉害
class Solution {
    public int rangeSumBST(TreeNode root, int low, int high) {
        int[] res = new int[1];
        dfs(root, low, high, res);
        return res[0];
    }
    private void dfs(TreeNode root, int low, int high,int[] result){
        if (root == null) {
            return;
        }
        //判断当前节点的值是否在给定区间内,如果是,则将其值加到结果数组res中
        if (low <= root.val && root.val <= high) {
            result[0] += root.val;
        }
        //递归地调用dfs函数遍历当前节点的左子树
        if (null != root.left) {
            dfs(root.left, low, high, result);
        }
        //递归地调用dfs函数遍历当前节点的右子树
        if (null != root.right) {
            dfs(root.right, low, high, result);
        }
    }
}

参考思路后的第二版:

class Solution {
    public int rangeSumBST(TreeNode root, int low, int high) {
        if (root == null) {
            return 0;
        }
        //判断当前节点的值是否大于上界high,如果是,则递归调用rangeSumBST函数处理当前节点的左子树
        if (root.val > high) {
            return rangeSumBST(root.left, low, high);
        }
        //判断当前节点的值是否小于下界low,如果是,则递归调用rangeSumBST函数处理当前节点的右子树
        if (root.val < low) {
            return rangeSumBST(root.right, low, high);
        }
        //如果当前节点的值在给定区间[low, high]内,则将当前节点的值加到结果中,并同时递归处理当前节点的左子树和右子树
        return root.val + 
            rangeSumBST(root.left, low, high) + rangeSumBST(root.right, low, high);
    }
}

整体思路是通过递归地遍历二叉搜索树的节点,并根据节点的值与给定区间的关系决定递归的方向。

如果节点的值大于上界,说明该节点及其左子树的值都大于上界,只需要递归处理左子树即可。

如果节点的值小于下界,说明该节点及其右子树的值都小于下界,只需要递归处理右子树即可。

如果节点的值在给定区间内,将当前节点的值累加到结果中,并同时递归处理左子树和右子树。

抛弃第一版需要全遍历,第二版只需要根据节点的值与给定区间的关系决定递归的方向。但总体思路都一样,都是通过递归的DFS(深度优先搜索)来解决。

时间复杂度:O(N)

空间复杂度:O(N)

相关文章
Java 通过IP获取对应的国家省份城市经纬度(离线文件方案)
一. 除了调用接口查询城市, 还可以通过离线文件查询城市, 使用GeoLite2 City库 二. 离线库下载地址: https://dev.maxmind.com/geoip/geoip2/geolite2/ 点击如下位置下载压缩文件 文件解压后有一个文件名为GeoLite2-City.
|
JSON 前端开发 Java
利用Spring Boot处理JSON数据实战(包括jQuery,html,ajax)附源码 超详细
利用Spring Boot处理JSON数据实战(包括jQuery,html,ajax)附源码 超详细
454 0
|
存储 资源调度 分布式计算
CDP中配置Apache Hadoop Yarn的安全性
CDP中配置Hadoop Yarn的安全性。
879 0
CDP中配置Apache Hadoop Yarn的安全性
|
存储 弹性计算 数据库
阿里云优惠券是什么?2024年阿里云优惠券领取地址链接和使用方法
阿里云优惠券为用户提供购云服务折扣。2024年可通过活动中获取各类云产品优惠。学生专享300元无门槛代金券,可用于购买ECS或轻量应用服务器。域名优惠口令(如com批量注册更享优惠)提供更多节省。领取阿里云超级红包(新人最高100元)。代金券可在查询,并在结算时选择使用。
2249 1
阿里云优惠券是什么?2024年阿里云优惠券领取地址链接和使用方法
|
缓存 关系型数据库 MySQL
一文彻底弄懂MySQL优化之深度分页
【10月更文挑战第24天】本文深入探讨了 MySQL 深度分页的原理、常见问题及优化策略。首先解释了深度分页的概念及其带来的性能和资源问题。接着介绍了基于偏移量(OFFSET)和限制(LIMIT)以及基于游标的分页方法,并分析了它们的优缺点。最后,提出了多种优化策略,包括合理创建索引、优化查询语句和使用数据缓存,帮助提升分页查询的性能和系统稳定性。
1436 1
|
11月前
|
搜索推荐 Android开发 开发者
探索安卓系统的最新特性与发展趋势
本文深入分析了Android 13的新功能和改进,以及这些更新对用户体验和开发者社区的影响。文章还预测了未来Android系统的发展方向,为技术爱好者提供了宝贵的信息。
|
监控 数据挖掘 关系型数据库
结构化思维的理解与思考
结构化思维是一种将信息要素从无效转化为有序,提炼核心要点,将信息转化为有结构的知识,更好的帮助大脑理解和记忆,并支持我们清晰表达的通用能力。
1545 2
结构化思维的理解与思考
|
监控 安全 数据安全/隐私保护
SNMPv3:网络管理的安全进化
【4月更文挑战第22天】
549 4
|
图形学
【用unity实现100个游戏之18】从零开始制作一个类CSGO/CS2、CF第一人称FPS射击游戏——基础篇2(附项目源码)
【用unity实现100个游戏之18】从零开始制作一个类CSGO/CS2、CF第一人称FPS射击游戏——基础篇2(附项目源码)
390 0
|
机器学习/深度学习 算法
【MATLAB第56期】#源码分享 | 基于MATLAB的机器学习算法单输入多输出分类预测模型思路(回归改分类)
因上一步骤进行了正常的回归预测,输出一般为小数点,且不是限定标签的数值。所以需要通过find函数,将回归预测的输出结果进行分段赋值。若涉及多隐含层,可修改[20,20,5]中的数字。前2个20代表两层隐含层的神经元数 ,后面的5为输出节点,根据本案例数据设置。输出分为五个指标,每个指标共4个评分维度,即【0 10 20 30】归一化区间可自行设置,默认[-1,1],本文采用[0,1]根据四舍五入的思路,如数据如果在5以下,则赋值为0,数据为1输入,5输出,总共482个样本。如果为[5,15),赋值为10…
【MATLAB第56期】#源码分享 | 基于MATLAB的机器学习算法单输入多输出分类预测模型思路(回归改分类)