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

在这里插入图片描述

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

初步认识深搜(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♪(・ω・)ノ谢谢阅读!!!

下一篇文章见!!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

poi-tl 生成 word 文件(插入文字、图片、表格、图表)

文章说明 本篇文章主要通过代码案例的方式&#xff0c;展示 poi-tl 生成 docx 文件的一些常用操作&#xff0c;主要涵盖以下内容 &#xff1a; 插入文本字符&#xff08;含样式、超链接&#xff09;插入图片插入表格引入标签&#xff08;通过可选文字的方式&#xff0c;这种方…

英国牛津大学博士后职位—统计学

牛津大学&#xff08;University of Oxford&#xff09;&#xff0c;简称“牛津”&#xff08;Oxford&#xff09;&#xff0c;位于英国牛津&#xff0c;是一所公立研究型大学&#xff0c;采用传统学院制。是罗素大学集团成员&#xff0c;被誉为“金三角名校”、“G5超级精英大…

python 第6册 辅助excel 002 批量创建非空白的 Excel 文件

---用教授的方式学习 此案例主要通过使用 while 循环以及 openpyxl. load_workbook()方法和 Workbook 的 save()方法&#xff0c;从而实现在当前目录中根据已经存在的Excel 文件批量创建多个非空白的Excel 文件。当运行此案例的Python 代码&#xff08;A002.py 文件&#xff0…

论文阅读_优化RAG系统的检索

英文名称: The Power of Noise: Redefining Retrieval for RAG Systems 中文名称: 噪声的力量&#xff1a;重新定义RAG系统的检索 链接: https://arxiv.org/pdf/2401.14887.pdf 作者: Florin Cuconasu, Giovanni Trappolini, Federico Siciliano, Simone Filice, Cesare Campag…

MyBatis Plus条件构造器使用

1Wrapper&#xff1a; 条件构造抽象类&#xff0c;最顶端父类 1.1 AbstractWrapper&#xff1a; 用于查询条件封装&#xff0c;生成 sql 的 where 条件 1.2 QueryWrapper&#xff1a; Entity 对象封装操作类&#xff0c;不是用lambda语法 1.3 UpdateWrapper&#xff1a; Update…

[Go 微服务] go-micro + consul 的使用

文章目录 1.go-micro 介绍2.go-micro 的主要功能3.go-micro 安装4.go-micro 的使用4.1 创建服务端4.2 配置服务端 consul4.3 生成客户端 5.goodsinfo 服务5.1 服务端开发5.2 客户端开发 1.go-micro 介绍 Go Micro是一个简化分布式开发 的微服务生态系统&#xff0c;该系统为开…

java热部署idea插件「jrebel安装教程」

告别漫长的项目重启等待&#xff0c;让开发像写诗一样流畅~ jrebel安装包下载 jrebel版本需要下比较老的版本&#xff0c;我用的是22.4.1的版本&#xff08;如果不差钱&#xff0c;可以支持一下正版&#xff0c;直接选择最新的版本即可&#xff09; 下载地址&#xff1a;传送门…

Python逻辑控制语句 之 判断语句--if else结构

1.if else 的介绍 if else &#xff1a;如果 ... 否则 .... 2.if else 的语法 if 判断条件: 判断条件成立&#xff0c;执行的代码 else: 判断条件不成立&#xff0c;执行的代码 &#xff08;1&#xff09;else 是关键字, 后⾯需要 冒号 &#xff08;2&#xff09;存在冒号…

链表-求链表中环的入口结点(easy)

目录 一、问题描述 二、解题思路 三、代码实现 四、刷题链接 一、问题描述 二、解题思路 本题基本思路&#xff1a; 1.设置一个hashSet来存储已经访问过的链表结点地址&#xff0c;注意不要直接存储链表内元素&#xff0c;因为链表内元素可能存在重复的&#xff0c;地址是不…

uniapp uniCloud云开发

uniCloud概述 uniCloud 是 DCloud 联合阿里云、腾讯云、支付宝云&#xff0c;为开发者提供的基于 serverless 模式和 js 编程的云开发平台。 uniCloud 的 web控制台地址&#xff1a;https://unicloud.dcloud.net.cn 文档&#xff1a;https://doc.dcloud.net.cn/uniCloud/ un…

【高考志愿】集成电路科学与工程

目录 一、专业概述 二、课程设置 三、就业前景 四、适合人群 五、院校推荐 六、集成电路科学与工程专业排名 一、专业概述 集成电路科学与工程&#xff0c;这一新兴且引人注目的交叉学科&#xff0c;正在逐渐崭露头角。它集合了电子工程、计算机科学、材料科学等多个领域的…

Kotlin中对空的很多处理

代码图片直观效果 逐行解释Kotlin中对空的各种情况的使用 private fun testNull() {val flag 1var name: String? nullvar user: User? // 有警告, 因为下面的赋值可以和这一行定义合并var zhangUser: User? User()var wangUser: User User() // 提示Explicitly given t…

Unity 字体创建时候容易导致字体文件不正确的一种情况

上面得到了两种字体格式&#xff0c;一种是TextMeshPro的&#xff0c;另一种是Unity UI系统中默认使用的字体资源。其原因是创建的位置不同导致的。 1.下面是TextMeshPro字体创建的位置 2&#xff1a;下面是Unity UI系统中默认使用的字体资源

Java学习【IO流:深入理解与应用(上)】

Java学习【IO流&#xff1a;深入理解与应用&#xff08;上&#xff09;】 &#x1f343;1.IO流体系结构&#x1f343;2.FileOutputStream&#x1f341;2.1FileOutputStream写数据的三种方式&#x1f341;2.2换行和续写 &#x1f343;3.FileInputStream&#x1f341;3.1每次读取…

pbootcms后台获取前端表单留言页面url

pbootcms在线留言表单&#xff0c;用户在网页前端提交表单成功后&#xff0c;在网站后台如何获取表单留言页面的url这个参数呢&#xff1f;下面举例说明&#xff1a;首先&#xff0c;我们在PBootcms后台对应的表单&#xff0c;添加需要记录的表单字段&#xff0c;例如 添加liuy…

微服务-网关Gateway

个人对于网关路由的理解&#xff1a; 网关就相当于是一个项目里面的保安&#xff0c;主要作用就是做一个限制项。&#xff08;zuul和gateway两个不同的网关&#xff09; 在路由中进行配置过滤器 过滤器工厂&#xff1a;对请求或响应进行加工 其中filters&#xff1a;过滤器配置…

停车场智能化管理:车位引导系统实现车位资源优化与数据分析

随着城市汽车保有量的不断增长&#xff0c;停车难问题日益凸显。尤其是在高峰时段&#xff0c;寻找停车位和取车成为了许多车主的头疼问题。为了解决这一难题&#xff0c;维小帮智能车位引导系统应运而生&#xff0c;它利用先进的技术手段&#xff0c;帮助车主快速找到停车位&a…

PySide(PyQt)在图像上画线

1、按鼠标左键任意画线 import sys from PySide6.QtWidgets import QApplication, QLabel, QVBoxLayout, QWidget from PySide6.QtGui import QPainter, QPixmap, QMouseEvent, QColor, QPen from PySide6.QtCore import Qt, QPointclass PaintLabel(QLabel):def __init__(self…

Linux自动化交互脚本expect开发

在日常开发任务中&#xff0c;运行shell脚本有时候会提示输入密码的操作&#xff0c;如何让脚本自动输入密码呢&#xff1f;这时使用expect帮我们输入&#xff0c;Expect是基于Tcl发展而来的&#xff0c;它不仅可以进行交互&#xff0c;还可以根据程序的提示模拟标准输入&#…

pytorch-01

加载mnist数据集 one-hot编码实现 import numpy as np import torch x_train np.load("../dataset/mnist/x_train.npy") # 从网站提前下载数据集&#xff0c;并解压缩 y_train_label np.load("../dataset/mnist/y_train_label.npy") x torch.tensor(y…