【刷题】初步认识深搜(DFS)

news2024/11/24 4:23:54

在这里插入图片描述

送给大家一句话:
拥有希望的人,和漫天的星星一样,是永远不会孤独的。
-- 《星游记》

初步认识深搜(DFS)

  • dfs算法
  • 二叉树中的深搜
    • Leetcode 129. 求根节点到叶节点数字之和
      • 题目描述
      • 算法思路
    • Leetcode 814. 二叉树剪枝
      • 题目描述
      • 算法思路
    • Leetcode 98. 验证二叉搜索树
      • 题目描述
      • 算法思路
    • Leetcode 257. 二叉树的所有路径
      • 题目描述
      • 算法思路
  • Thanks♪(・ω・)ノ谢谢阅读!!!
  • 下一篇文章见!!!

dfs算法

深度优先搜索(DFS)是一种常用的搜索算法,它通过尽可能深地搜索树的分支,来寻找解决方案。由于其简单和易于实现的特性,DFS成为解决问题的强大工具,尤其是在数据规模较小的情况下。数据在100以内一般使用DFS

运行原理: DFS算法的核心思想是从一个起点开始,沿着树的边走到尽可能深的分支上,然后回溯到之前的分叉点,寻找未探索的分支,对不满足条件的分支进行剪枝。这个过程重复进行,直到找到解决方案或探索完所有可能的路径。DFS通常使用递归实现,这使得代码简洁易读。

dfs算法其实我们一点也不陌生,早在二叉树的学习中,用于遍历二叉树的前序遍历,中序遍历,后序遍历都是使用的dfs算法,所以dfs并不神秘!!!我们接下来在实际应用中来加强对dfs算法的认识。

二叉树中的深搜

我准备了以下题目,我们一起来看看吧:

Leetcode 129. 求根节点到叶节点数字之和

家人们!上链接:129. 求根节点到叶节点数字之和

题目描述

在这里插入图片描述
根据题目,每条路径都是一个数字,我们要做的是将每条路径的数字加起来得到一个和。

算法思路

我们的工作就是得到每条路径的数字,而得到这些数字的最简单的办法就是使用dfs算法,一条一条的搜索下去。

使用dfs算法我们需要明白dfs函数体是对一个节点的处理,我们要顾全好大局,避免出现不必要的错误。
通常我们使用全局变量来优化我们的dfs函数体,通过全局变量,就不需要传递过多的参数了。

class Solution {
public:
	//
    int sumNumbers(TreeNode* root) {
        vector<long long > nums;
        dfs(nums ,0 , root);
        long long  ans = 0 ;
        for(auto s : nums)
            ans += s;
        return ans;
    }
    void dfs(vector<long long >& nums , long long bef , TreeNode* root)
    {
        if(root == nullptr) return ;
        if(root->left == nullptr && root->right == nullptr)
        {
            bef *= 10;
            nums.push_back(bef + root->val);
        }

        dfs(nums , bef * 10 + root->val , root->left);
        dfs(nums , bef * 10 + root->val , root->right);
    }
};

提交:过啦!!!

Leetcode 814. 二叉树剪枝

上链接:814. 二叉树剪枝

题目描述

在这里插入图片描述
本题需要我们对二叉树进行判断,将不满足条件的进行剪枝操作。

算法思路

我们主要需要进行两步:判断与剪枝

  1. 判断需要对子树进行判断是否有1;
  2. 剪枝就直接将指向设置为nullptr即可;

dfs的函数体只针对当前节点进行判断,我们要相信其中的dfs可以解决后续问题。

  1. 首先需要对当前节点进行判断,如果为空直接返回空指针!
  2. 然后我们需要对左右子树进行判断,判断的结果时(子树满足条件就是原本的子树,反之是nullptr)
  3. 对左右子树检查好了,就要检查当前节点,如果左右子树都为空了,并且当前节点的数字还是 0 ,直接进行删除!

其实这套算法的本质是后序遍历,从叶子节点开始向上删除。

class Solution {
public:
    TreeNode* pruneTree(TreeNode* root) {
        return dfs(root);
    }
    TreeNode* dfs(TreeNode* root)
    {
        //后序遍历
        //返回值决定上层是否删除
        if(root == nullptr) return nullptr;
        //是叶子节点才返回
        else 
        {
            //该层处理
            root->left = dfs(root->left);
            root->right = dfs(root->right);
            if(!root->right && !root->left && root->val == 0 ) return nullptr;
            else return root;
        }
    }
};

提交:过啦!!!

Leetcode 98. 验证二叉搜索树

上连接:98. 验证二叉搜索树

题目描述

在这里插入图片描述
这题对于我们学过二叉搜索树,AVL树,红黑树的简直是小菜一碟!

算法思路

二叉搜索树有一个重要的性质:中序遍历会得到有序数据。
所以判断是否为二叉搜索树就可以通过这个性质来判断,我们模拟进行中序遍历:

  1. 中序遍历的核心是先左子树 ,再当前节点 ,最后是右子树
  2. 那么为了快速进行判断是否有序,我们肯定不能把所有的数据都遍历一遍再判断是否有序!而是在遍历的过程中就完成判断的过程!
  3. 判断是否有序就是比较当前数是否比它之前那个数大!那么如何获取之前的数呢?很简单,因为我们是以模拟中序遍历,很自然的就可以获取到当前节点之前的那个数!
  4. 记住 : dfs函数体只需要考虑如何解决当前节点!!!不要多考虑!
class Solution {
public:
	//使用全局变量来记录 上一个节点的值
    long long prev = LONG_MIN ; 

    bool isValidBST(TreeNode* root) {
        return dfs(root);
    }
    //dfs函数
    bool dfs(TreeNode* root)
    {
    	//如果为空就直接返回
        if(root == nullptr) return true;
        
        //通过中序遍历解决问题
        //对左进行判断
        bool l = dfs(root->left);
        if(!l) return false;
        
        //对当前节点进行判断
        if(root->val <= prev) return false;
        //再当前节点更新 prev
        prev = root->val;
        
        //对右边进行判断
        bool r = dfs(root->right);
        if(!r) return false;
        return l && r;
    }
};

提交:过啦!!!
再分析一个中序遍历的题目,框架是一致的:230. 二叉搜索树中第K小的元素

Leetcode 257. 二叉树的所有路径

上链接:257. 二叉树的所有路径

题目描述

在这里插入图片描述
非常好理解的题目奥

算法思路

这道题的思路很简单,把所有的路径都遍历一遍就可以了!
注意细节的处理:

  1. 路径何时加上->才能保证不会多加? 再当前节点不为空,将val一起插入,还有左右子树再插入->即可
  2. 何时路径结束? 到叶子节点就结束!
  3. 注意回溯的问题!!!
class Solution {
public:
    vector<string> ans;
    
    vector<string> binaryTreePaths(TreeNode* root) {
        string path = "";
        dfs(path , root);
        return ans;
    }
    void dfs(string path , TreeNode* root)
    {
        if(root == nullptr) return ;
        path += to_string(root->val);
        if(!root->left && !root->right) 
        {
            ans.push_back(path);
            return ;
        }
        path += "->";
        //对左边进行处理 
        if(root->left) dfs(path , root->left);
        //对右边进行处理
        if(root->right) dfs(path , root->right);
    }
};

提交过啦!!!

Thanks♪(・ω・)ノ谢谢阅读!!!

下一篇文章见!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1876676.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

FreeRTOS的裁剪与移植

文章目录 1 FreeRTOS裁剪与移植1.1 FreeRTOS基础1.1.1 RTOS与GPOS1.1.2 堆与栈1.1.3 FreeRTOS核心文件1.1.4 FreeRTOS语法 1.2 FreeRTOS移植和裁剪 1 FreeRTOS裁剪与移植 1.1 FreeRTOS基础 1.1.1 RTOS与GPOS ​ 实时操作系统&#xff08;RTOS&#xff09;&#xff1a;是指当…

C语言中常用的运算符、表达式和语句

C语言是一种通用的、高级的编程语言&#xff0c;其历史可以追溯到20世纪60年代末至70年代初。C语言最初是由丹尼斯里奇&#xff08;Dennis Ritchie&#xff09;在贝尔实验室为开发UNIX操作系统而设计的。它继承了许多B语言的特性&#xff0c;而B语言则是由迷糊老师&#xff08;…

基于YOLOv9+pyside的安检仪x光危险物物品检测(有ui)

安全检查在公共场所确保人身安全的关键环节&#xff0c;不可或缺。X光安检机作为必要工具&#xff0c;在此过程中发挥着重要作用。然而&#xff0c;其依赖人工监控和判断成像的特性限制了其应用效能。本文以此为出发点&#xff0c;探索了基于Torch框架的YOLO算法在安检X光图像中…

spring和springboot的关系是什么?

大家好&#xff0c;我是网创有方的站长&#xff0c;今天给大家分享下spring和springboot的关系是什么&#xff1f; Spring和Spring Boot之间的关系可以归纳为以下几个方面&#xff1a; 技术基础和核心特性&#xff1a; Spring&#xff1a;是一个广泛应用的开源Java框架&#…

深入理解一致性Hash和虚拟节点

在分布式系统中架构中我们经常提到一致性哈希算法&#xff0c;那么什么是一致性哈希算法&#xff0c;为什么需要一致性哈希算法呢&#xff1f; 1、为什么需要一致性哈希算法 假设现在有三台缓存服务器&#xff08;缓存服务器A、缓存服务器B、缓存服务器C&#xff09;&#xff…

每日一题——Python实现PAT乙级1059 C语言竞赛(举一反三+思想解读+逐步优化)四千字好文

一个认为一切根源都是“自己不够强”的INTJ 个人主页&#xff1a;用哲学编程-CSDN博客专栏&#xff1a;每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 我的写法 时间复杂度分析 空间复杂度分析 代码优化建议 总结 我要更强 优化方法…

fastadmin selectpage下拉框默认选中

修改 /public/assets/libs/fastadmin-selectpage/selectpage.js

C++【引用】

P. S.&#xff1a;以下代码均在VS2019环境下测试&#xff0c;不代表所有编译器均可通过。 P. S.&#xff1a;测试代码均未展示头文件stdio.h的声明&#xff0c;使用时请自行添加。 博主主页&#xff1a;LiUEEEEE                        …

入门Java爬虫:认识其基本概念和应用方法

Java爬虫初探&#xff1a;了解它的基本概念与用途&#xff0c;需要具体代码示例 随着互联网的快速发展&#xff0c;获取并处理大量的数据成为企业和个人不可或缺的一项任务。而爬虫&#xff08;Web Scraping&#xff09;作为一种自动化的数据获取方法&#xff0c;不仅能够快速…

【数据分析】1、用Pandas计算数据相关性系数

相关性系数和相关分析是了解变量之间关系的重要工具。通过合理选择相关性系数和科学分析数据&#xff0c;能够有效揭示变量之间的关系&#xff0c;为进一步研究和决策提供有力支持。在实际应用中&#xff0c;应结合业务背景、数据特性和统计原则&#xff0c;谨慎解释和应用相关…

基于知识图谱的医药问答系统实战

数据及代码地址见文末 1.项目配置 (1)Neo4j数据库安装 JDK 安装:https://www.oracle.com/java/technologies/javase-downloads.html Neo4j 安装:https://neo4j.com/download-center/ 配置好 JDK 和 Neo4j 的环境变量 启动:neo4j.bat console 第一次启动有默认用户名和密…

数字信号处理教程(1)——简介

考了几天试&#xff0c;终于有时间来继续写了&#xff0c;接下来&#xff0c;我们主要对数字信号处理和通信原理这两本偏于理论书记录自己的简单看法。当然其他大家讲的比较好的地方&#xff0c;我也会摘录下来。 先来看数字信号处理的内容&#xff0c;数字信号处理中有…

Gradio 4.37.1官方教程二:Blocks

文章目录 一、Blocks及事件监听器1.1 Blocks结构1.2 事件监听器的类型1.3 多数据流1.4 多输入组件1.5 多输出组件1.6 更新组件配置1.7 添加示例1.8 连续运行事件1.9 持续运行事件1.9.1 every参数1.9.2 load方法1.9.3 change方法 1.10 收集事件数据1.11 绑定多个触发器到同一函数…

【ai】trition:tritonclient yolov4:ubuntu18.04部署python client成功

X:\05_trition_yolov4_clients\01-python server代码在115上,client本想在windows上, 【ai】trition:tritonclient.utils.shared_memory 仅支持linux 看起来要分离。 【ai】tx2 nx:ubuntu18.04 yolov4-triton-tensorrt 成功部署server 运行 client代码远程部署在ubuntu18.0…

从灵感到实践:Kimi辅助完成学术论文选题的文艺之旅

学境思源&#xff0c;一键生成论文初稿&#xff1a; AcademicIdeas - 学境思源AI论文写作 昨天我们为大家介绍了ChatGPT辅助完成实现设计&#xff08;AI与学术的交响&#xff1a;ChatGPT辅助下的实验设计新篇章&#xff09;。今天我们再来看看Kimi对于论文选题都能提供哪些帮助…

mindspore打卡第9天 transformer的encoder和decoder部分

mindspore打卡第9天 transformer的encoder和decoder部分 import mindspore from mindspore import nn from mindspore import ops from mindspore import Tensor from mindspore import dtype as mstypeclass ScaledDotProductAttention(nn.Cell):def __init__(self, dropout_…

如何修改PDF文档的作者名称?

要修改一个 PDF 文档的作者名称&#xff0c;你可以按照以下步骤进行操作&#xff1a; 1. **使用 Adobe Acrobat**&#xff08;如果有&#xff09;&#xff1a; - Adobe Acrobat 是一个功能强大的 PDF 编辑工具&#xff0c;支持修改文档属性信息&#xff0c;包括作者名称。打开…

SSRF一篇文章实战举例全面学懂

前言 Gopher协议在SSRF漏洞中的深入研究&#xff08;附视频讲解&#xff09; - 知乎 (zhihu.com) 上面这篇文章真的写的很好&#xff0c;是目前看过最好的将SSRF(服务端请求伪造)和Gopher协议的内容。 然后这种题型&#xff0c;我记得在之前的文章&#xff0c;金砖里有个云启…

Python 面试【★★★】

欢迎莅临我的博客 &#x1f49d;&#x1f49d;&#x1f49d;&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

HIVE每日一题

select * from sku_info order by sku_id ; 为什么结果没有顺序排序。什么原因导致的&#xff1f;