算法沉淀 —— 深度搜索(dfs)

news2024/11/26 21:32:36

算法沉淀 —— 深度搜索(dfs)

  • 一、计算布尔二叉树的值
  • 二、求根节点到叶节点数字之和
  • 三、二叉树剪枝
  • 四、验证二叉搜索树
  • 五、二叉搜索树中第K小的元素

一、计算布尔二叉树的值

【题目链接】:2331. 计算布尔二叉树的值
【题目】:
在这里插入图片描述

【分析】:
 在确定一颗二叉树的布尔值前,我们需要先得到左子树、右子树的结果(0/1)。如果左子树、右子树不是叶子节点,显然这是一个递归子问题(将求左子树、右子树的布尔值);
 最后就是根据root的值来判断对左/右子树结果的操作(如果是2,按位或;否则为按位与)

【代码实现】:

class Solution {
public:
    bool evaluateTree(TreeNode* root) {
        if(root->left == nullptr && root->right == nullptr)
            return root->val;
        //完成二叉树保证如果非叶子节点,则左右子树都不为空
        bool ansL = evaluateTree(root->left);//递归处理左子树
        bool ansR = evaluateTree(root->right);//递归处理右子树
        return root->val == 2 ? ansL | ansR : ansL & ansR;
    }
};

二、求根节点到叶节点数字之和

【题目链接】:129. 求根节点到叶节点数字之和

【题目】:
在这里插入图片描述

【分析】:
 根节点到叶节点数字之和,显然如果当前节点为叶子节点,此时直接返回结果;否则需要得到当前路径之前路径和(假设为prev),此时当前路径数字和为root->val + prev*10。此时在重复上述过程,如果时叶子节点,直接返回结果;否则转化为递归子问题求解(左子树、右子树只有非空,都有结果)
由于根节点到叶节点的路径可能存在多条,每一条路径都存在一个结果。所以这里我们可以定义一个全局变量来记录最后的累计结果(具体看代码)
【代码实现】:

class Solution {
public:
    int sum = 0;
    int sumNumbers(TreeNode* root) {
        int prev = 0;
        _sumNumbers(root, 0);//prev用于记录当前节点前的路径和
        return sum;
    }

    void _sumNumbers(TreeNode* root, int prev)
    {
        prev = prev * 10 + root->val;//还是使用prev来保存当前路径数字和
        if(root->left)//左子树非空,必然存在结果,转化成递归子问题求解
           _sumNumbers(root->left, prev);
        if(root->right)//右子树非空,同上
           _sumNumbers(root->right, prev);
        if(root->left == nullptr && root->right == nullptr)//叶子节点, 累加当前路径和
            sum += prev;
    }
};

三、二叉树剪枝

【题目链接】:814. 二叉树剪枝
【题目】:
在这里插入图片描述
在这里插入图片描述
【分析】:
 本题中,我们可以采用二叉树后序遍历的思想。先对左子树、右子树分别进行剪枝操作。此时左/右子树中有两种结果:非空、非空(此时子树已经进行了剪枝)。所以此时当前节点必须满足左/右子树均为空,并且根节点为0时,才可继续剪枝。
【代码实现】:

class Solution {
public:
    TreeNode* pruneTree(TreeNode* root) {
        //二叉树后序遍历,进行剪枝
        //对左/右子树剪枝后,左/右子树只有两种结果: 为空、剪完枝非空。
        if(root == nullptr)
            return nullptr;
        root->left = pruneTree(root->left);//对左子树剪枝
        root->right = pruneTree(root->right);//右子树剪枝
        if(root->left == nullptr && root->right == nullptr && root->val == 0)
        {
            delete root;//笔试建议省略此步,原因在于如果root不是new出来的,会报错
            root = nullptr;
        }
        return root;
    }
};

四、验证二叉搜索树

【题目链接】:98. 验证二叉搜索树
【题目】:
在这里插入图片描述
在这里插入图片描述

【分析】:
 我们可以利用二叉搜索树中序遍历是升序的性质来判断是否为二叉搜索树。但如何利用呢?
 其中一种思路是先用一个数组记录二叉树中序遍历结果,在判断是否为升序。但此时算法的空间复杂度为O(n)。
 另一种思路就是使用一个全局遍历(prev)来记录中序遍历的前一个数据,然后转化成当前节点和prev比较(当然还有prev值更新啦)。让后根据左子树、右子树、根节点的结果来判断是否符合AVL树(具体参考代码)
tips:

  • prev的初始值需要设置为LLONG_MIN(比INT_MIN小即可)。
    【代码实现】:
class Solution {
public:
    long long prev = LLONG_MIN;//保存中序遍历的前一个节点值
    bool isValidBST(TreeNode* root) {
        if(root == nullptr)
            return true;
        bool Left = isValidBST(root->left);//记录左子树结果
        bool cur = false;//记录当前根节点和上一个数据是否符合AVL树性质
        if(root->val > prev)
        {
            prev = root->val;
            cur = true;
        }
        bool Right = isValidBST(root->right);//记录左子树结果
        return Left && Right && cur;
        
    }
};

五、二叉搜索树中第K小的元素

【题目链接】:230. 二叉搜索树中第K小的元素
【题目】:
在这里插入图片描述

在这里插入图片描述
【分析】:
 本题意思非常明确,求第k小元素。我们可以通过中序遍历,每遍历一次元素,k–。直到k为1时,返回结果。
 这里博主推荐将返回值(定义为ret)、和k的值都设置为全局变量。然后和中序遍历一样,我们只需当k的值为1时,返回结果结果;并且每次遍历k–。
【代码实现】:

class Solution {
public:
    int count = 0, ret = 0;
    int kthSmallest(TreeNode* root, int k) {
        count = k;
        _kthSmallest(root);
        return ret;
    }

    void _kthSmallest(TreeNode* root)
    {
        if(root == nullptr || count == 0)
            return;
        _kthSmallest(root->left);
        if(--count == 0)
            ret = root->val;
        _kthSmallest(root->right);
    }
};

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

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

相关文章

MambaMixer、NeSLAM、Talk3D、BundledSLAM、ShapeFusion

本文首发于公众号:机器感知 MambaMixer、NeSLAM、Talk3D、BundledSLAM、ShapeFusion ShapeFusion: A 3D diffusion model for localized shape editing In the realm of 3D computer vision, parametric models have emerged as a ground-breaking methodology fo…

全套医院手术麻醉系统源码 人工智能麻醉系统源码 医疗管理系统源码

全套医院手术麻醉系统源码 人工智能麻醉系统源码 医疗管理系统源码 手术麻醉临床信息系统有着完善的临床业务功能,能够涵盖整个围术期的工作,能够采集、汇总、存储、处理、展现所有的临床诊疗资料。通过该系统的实施,能够规范麻醉科的工作流…

Qt实现通过.css样式文件实时加载QSS样式

初学Qt时要想通过QSS修改控件QWidget,QPushButton等原生基础控件的样式,一般都是直接在.ui文件中直接添加qss,或者在代码中通过setStyleSheet(QString qss)来设置。当程序很大时,很多地方需要复用样式时会非常麻烦,qss…

C++教学——从入门到精通 6.ASCII码与字符型

如何把小写字母转换成大写字母呢? 这个问题问的好,首先我们要新学一个类型——char 这个类型就是字符型 再来说说ASCII码 给大家举几个例子 空格————32 0————48 9————57 A————65 Z————90 a————97 z————122 我们…

LeetCode-560. 和为 K 的子数组【数组 哈希表 前缀和】

LeetCode-560. 和为 K 的子数组【数组 哈希表 前缀和】 题目描述:解题思路一:一边算前缀和一边统计。这里用哈希表统计前缀和出现的次数,那么和为k的子数组的个数就是当前前缀和-k的个数,即preSums[presum - k]。画个图表述就是&a…

NGINX 反向代理 CORS

我遇到了一个问题就是 Nginx 是作为反向代理服务器部署的,但因为 Nginx 的配置导致 CORS 问题。 在这个时候我们可以对 Nginx 的配置文件进行修改: 在 location 后添加下面的内容: add_header Access-Control-Allow-Origin *; add_header A…

Kafka入门到实战-第二弹

Kafka入门到实战 Kafka快速开始官网地址Kafka概述Kafka术语Kafka初体验更新计划 Kafka快速开始 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容不一定100%复现, 还要以官方信息为准 https://kafka.apache.org/Kafka概述 Apache Kafka 是一个开源的分布式事件流…

ES6学习之路:迭代器Iterator和生成器Generator

迭代器 一、知识背景 什么是迭代器 迭代器就是在一个数据集合中不断取出数据的过程迭代和遍历的区别 遍历是把所有数据都取出迭代器注重的是依次取出数据,它不会在意有多少数据,也不会保证能够取出多少或者能够把数据都取完。比如斐波那契额数列&#…

离散时间动态系统的集成自适应动态规划智能控制-北科大博毕

主要内容: 传统值迭代产生迭代控制策略,给出稳定性和吸引域判据;传统值迭代则迭代过程中得到可容许策略折扣因子对迭代控制策略可容许的影响,神经网络对未知系统建模,讨论模型网络权重更新情况下参数误差和系统状态估…

TikTok零播放?可能是海外代理IP的问题

在当今社交媒体的蓬勃发展中,TIKTOK作为一款备受欢迎的短视频平台,其直播功能也逐渐受到用户的青睐。然而,有时候跨境电商商家在进行直播时却面临着一个令人头疼的问题:没有观众。这时候,海外代理IP可能是一个潜在的原…

吴恩达:别光盯着GPT-5,用GPT-4做个智能体可能提前达到GPT-5的效果

最近,斯坦福大学教授吴恩达在演讲中提到,他们发现,基于 GPT-3.5 构建的智能体工作流在应用中表现比 GPT-4 要好。 AI 智能体是去年很火的一个话题,但是 AI 智能体到底有多大的潜力,很多人可能没有概念。 最近&#x…

【环境搭建】(四)ubuntu22.04系统安装Opencv4.8.0+Opencv-contrib4.8.0

一个愿意伫立在巨人肩膀上的农民...... 一、安装下载所需工具 1.打开终端,输入以下命令来更新软件源: sudo apt-get update 2.安装wget: sudo apt-get install wget 3.下载opencv和opencv-contrib包: wget -O opencv-4.8.0.…

ISP-VPN实验

文章目录 ISP-VPN实验一,实验拓扑二、实验要求三、IP规划四、实验配置1、IP配置R1的配置R2的配置R3的配置R4的配置R5的配置 2、配置缺省路由3、认证与被认证配置4、HDLC封装5、构建MGRE和GRE6、整个私有网络基于RIP全网可达7、查看路由配置和PC端配置8、PC端pingR5的…

Vue element-plus 导航栏 [el-menu]

导航栏 [el-menu] Menu 菜单 | Element Plus el-menu有很多属性和子标签,为网站提供导航功能的菜单。 常用标签: 它里面有两个子标签。el-menu-item,它其实就是el-menu每一个里面的item,item就是真实匹配到路由的每个栏目&#…

【Python使用】嘿马头条完整开发md笔记第3篇:数据库,1 新增【附代码文档】

嘿马头条项目从到完整开发笔记总结完整教程(附代码资料)主要内容讲述:课程简介,ToutiaoWeb虚拟机使用说明1 产品介绍,2 原型图与UI图,3 技术架构,4 开发,1 需求,2 注意事项。数据库,理解ORM1 简介,2 安装,3 数据库连接…

使用CRXjs、Vite、Vue 开发 Chrome 多页面插件,手动配置 vite.config.ts 和 manifest.json 文件

一、使用CRXjs、Vite、Vue 开发 Chrome 多页面插件,手动配置 vite.config.ts 和 manifest.json 文件 一、创建 Vue 项目 1. 使用 Vite 创建 Vue 项目 npm create vitelatest # npm yarn create vite # yarn pnpm create vite # pnpm选择 Vue 和 TS 进入项目…

SpringBoot微服务实现深度学习:构建AGI道路的基石+实战案例演示

🎉🎉欢迎光临,终于等到你啦🎉🎉 🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀 🌟持续更新的专栏《Spring 狂野之旅:从入门到入魔》 &a…

4月4日生效!管控升级!继续围堵 | 百能云芯

据路透社29日报道,美国拜登政府当天修改规则,升级针对中国人工智能(AI)芯片和相关工具出口管制的措施。报道声称,这是美国以国家安全为由阻碍中国芯片制造业发展的努力的一部分。 美国商务部下属的工业与安全局&#x…

移动硬盘损坏打不开?别慌,数据恢复有妙招!

移动硬盘作为我们日常存储和传输数据的重要工具,一旦遇到损坏打不开的情况,无疑会让我们倍感焦虑。毕竟,其中存储的文件可能关乎工作、学习或生活的方方面面,一旦丢失,后果不堪设想。那么,当移动硬盘损坏打…

UE5 SQLite笔记

开发环境: 系统:Windows 10 64 bit 引擎:Unreal Engine 5.1.1 IDE:JetBrains Rider 2023.2.1 语言:C 工具:DB Browser for SQLite SQLite数据类型: //INTEGER TEXT BLOB REAL NUMERIC/*integer…