从小白开始刷算法 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)附源码 超详细
387 0
|
存储 资源调度 分布式计算
CDP中配置Apache Hadoop Yarn的安全性
CDP中配置Hadoop Yarn的安全性。
851 0
CDP中配置Apache Hadoop Yarn的安全性
|
7月前
|
存储 人工智能 API
DeepSeek——DeepSeek模型部署实战
本文介绍了DeepSeek大模型的本地部署方法、使用方式及API接入。首先,通过下载Ollama平台部署DeepSeek-R1模型,提供7种不同参数版本(1.5b至671b),用户可根据硬件选择合适的模型大小。接着,文章详细描述了如何在终端运行命令启动模型,并通过Chatbox官网下载并接入DeepSeek API,实现本地和云端模型的交互。最后,提及了DeepSeek官网和集成工具如POE的使用,帮助用户更好地利用DeepSeek进行开发和应用。
|
11月前
|
缓存 关系型数据库 MySQL
一文彻底弄懂MySQL优化之深度分页
【10月更文挑战第24天】本文深入探讨了 MySQL 深度分页的原理、常见问题及优化策略。首先解释了深度分页的概念及其带来的性能和资源问题。接着介绍了基于偏移量(OFFSET)和限制(LIMIT)以及基于游标的分页方法,并分析了它们的优缺点。最后,提出了多种优化策略,包括合理创建索引、优化查询语句和使用数据缓存,帮助提升分页查询的性能和系统稳定性。
1153 1
|
9月前
|
搜索推荐 Android开发 开发者
探索安卓系统的最新特性与发展趋势
本文深入分析了Android 13的新功能和改进,以及这些更新对用户体验和开发者社区的影响。文章还预测了未来Android系统的发展方向,为技术爱好者提供了宝贵的信息。
|
监控 数据挖掘 关系型数据库
结构化思维的理解与思考
结构化思维是一种将信息要素从无效转化为有序,提炼核心要点,将信息转化为有结构的知识,更好的帮助大脑理解和记忆,并支持我们清晰表达的通用能力。
1476 2
结构化思维的理解与思考
|
图形学
【用unity实现100个游戏之18】从零开始制作一个类CSGO/CS2、CF第一人称FPS射击游戏——基础篇2(附项目源码)
【用unity实现100个游戏之18】从零开始制作一个类CSGO/CS2、CF第一人称FPS射击游戏——基础篇2(附项目源码)
296 0
|
监控 安全 数据安全/隐私保护
SNMPv3:网络管理的安全进化
【4月更文挑战第22天】
488 4
|
网络协议 数据安全/隐私保护 网络架构
通俗科普:网关是什么?
通俗科普:网关是什么?
9108 0