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

算法沉淀 —— 深度搜索(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);
    }
};

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

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

相关文章

Pyhon 大模型常见的微调方式,LLMs常见的Finetune方式;chatglm3微调实战;大模型微调通俗易懂总结

一、 LLMs微调 微调(Fine-tuning)是指在一个已经训练好的神经网络模型基础上,使用额外的数据集或调整超参数,以实现特定任务的训练过程。在微调中,通常会固定预训练模型的大部分参数,只调整最后几层或特定层…

Windows安装TortoiseSVN客户端结合Cpolar实现公网提交文件到本地服务器

文章目录 前言1. TortoiseSVN 客户端下载安装2. 创建检出文件夹3. 创建与提交文件4. 公网访问测试 前言 TortoiseSVN是一个开源的版本控制系统,它与Apache Subversion(SVN)集成在一起,提供了一个用户友好的界面,方便用…

盲水印脚本安装说明_bwm、_bwmforpy

此工具需要python2/python3 脚本下载地址https://gitcode.com/chishaxie/BlindWaterMark/tree/master?utm_sourcecsdn_blog_hover 直接下载压缩包解压 在python里面添加两个库,python.exe目录上方输入cmd pip install opencv-python python.exe -m pip install …

docker部署实用的运维开发手册

下载镜像 docker pull registry.cn-beijing.aliyuncs.com/wuxingge123/reference:latestdocker-compose部署 vim docker-compose.yml version: 3 services:reference:container_name: referenceimage: registry.cn-beijing.aliyuncs.com/wuxingge123/reference:latestports:…

Gparted工具 初始化磁盘

Gparted工具 初始化磁盘 1、安装 没有此工具请先安装: yum install epel-release yum install gparted yum install yum-utils git gnome-common gcc-c yum-builddep gparted 2、打开Gparted工具,初始化磁盘 使用具有root权限的普通用户打开gparted&…

回溯算法|40.组合总和II

力扣题目链接 class Solution { private:vector<vector<int>> result;vector<int> path;void backtracking(vector<int>& candidates, int target, int sum, int startIndex, vector<bool>& used) {if (sum target) {result.push_back…

OSPF不规则区域以及OSPF的数据库和优化OSPF的LSA

OSPF的不规则区域 远离骨干非骨干区域不连续骨干-----区域水平分割 解决方案&#xff1a; 1.tunnel ---点到点GRE 在合法与非法ABR(在两个区域之间&#xff0c;但没有连到骨干area0)间建立隧道&#xff0c;然后将其宣告于OSPF协议中&#xff1b; 缺点&#xff1a;1、周期和…

Web应急响应

2024年护网将至&#xff0c;最近我将分享一些红蓝对抗的一些技巧&#xff0c;应急响应、信息收集相关的知识概念以及相关技巧。 目录 1. 黑客攻击流程 2. webshell流量特征 1.1.菜刀特征 1.2.冰蝎3.0 &#xff1a; 1.3.冰蝎2.0&#xff1a; 1.4.冰蝎3.11流量特征 1.5.蚁…

cocos使用playable ads adapter打包试玩广告报错RangeError: Invalid string length

前言 最近有做试玩广告的需求&#xff0c;引擎用的cocos&#xff0c;打包使用的playable ads adapter插件。不过最近打包遇到个奇怪的问题&#xff0c;就是通过插件打包报错RangeError: Invalid string length。因为之前也用空包和早期项目测试过都能顺利打包&#xff0c;经过…

数码管时钟--LABVIEW编程

一、程序的前面板 1.获取系统时钟&#xff0c;年月日&#xff0c;时分秒&#xff0c;用14个数码管显示。 2.闹钟设定小时和分钟。 二、程序的后面板 三、程序运行图 四、程序源码 源程序可以在百度网盘自行下载&#xff0c;地址链接见下方。 链接&#xff1a;https://pan.b…

健身运动蓝牙耳机什么牌子好?五大业内顶级优品推荐

在当下这个健身热潮席卷的时代&#xff0c;越来越多的人开始注重运动与健康&#xff0c;而音乐作为运动时的最佳伴侣&#xff0c;无疑为锻炼过程增添了不少乐趣。为了在运动时享受音乐&#xff0c;一款优质的健身运动蓝牙耳机显得尤为重要&#xff0c;市场上各大品牌纷纷推出自…

python对接百度云车牌识别

注册百度智能云&#xff0c;选择产品服务。 https://console.bce.baidu.com/ 每天赠送200次&#xff0c;做开发测试足够了。 在应用列表复制 AppID , API Key ,Secret Key 备用。 SDK下载地址 https://ai.baidu.com/sdk#ocr 下载SDK文件&#xff0c;解压&#xff0c;…

如何在Plesk面板备份网站

本周有一个客户&#xff0c;购买Hostease的Windows虚拟主机&#xff0c;咨询我们的在线客服&#xff0c;询问Windows虚拟主机Plesk面板是否提供备份功能。我们为用户提供教程&#xff0c;用户很快完成了数据备份。在此&#xff0c;我们分享这个操作教程&#xff0c;希望可以对您…

差点引爆全球的核弹,深度分析XZ-Utils供应链后门投毒事件

处心积虑的投毒者蛰伏三年多&#xff0c;精心选择对象&#xff0c;通过复杂的攻击手法、专业的技战术&#xff0c;一步步支起一张大网&#xff0c;企图掌控全球主流linux发行版&#xff0c;一旦成功他将可以随意侵入全球绝大多数的服务器&#xff0c;这将是足以引爆全球的核弹危…

AI技术创业:挖掘行业解决方案、智能产品服务及教育培训的无限机遇

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

1 导入图片后 调整图片大小

导入图片 如下图&#xff0c;通过“文件 → 打开”在PS中导入一张图片&#xff0c;但是图片有点小 有三种改变大小的方法 1 只要部分图片&#xff0c;画布大小不变 方式&#xff1a;按住ctrlt&#xff0c;就会出现如图所示的选框 画布大小不变&#xff0c;但是拖动选框&…

吴恩达深度学习笔记:浅层神经网络(Shallow neural networks)3.9-3.11

目录 第一门课&#xff1a;神经网络和深度学习 (Neural Networks and Deep Learning)第三周&#xff1a;浅层神经网络(Shallow neural networks)3.9 神 经 网 络 的 梯 度 下 降 &#xff08; Gradient descent for neural networks&#xff09;3.10&#xff08;选修&#xff0…

使用Redis集合List实现消息队列

系列文章目录 文章目录 系列文章目录前言前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 Redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型…

MySQL经验分享:Shell开发问题

背景 之前整理过Python连接使用MySQL的经验&#xff0c;链接如下&#xff1a; pymysql封装总结_pymysql封装类-CSDN博客 相比高级语言&#xff0c;Shell与MySQL开发使用相对会更麻烦一些&#xff1b;由于 shell是linux命令集的概称&#xff0c;是属于命令行的人机界面。Shel…

k8s 基础入门

1.namespace k8s中的namespace和docker中namespace是两码事&#xff0c;可以理解为k8s中的namespace是为了多租户&#xff0c;dockers中的namespace是为了网络、资源等隔离 2.deployment kubectl create #新建 kubectl aply #新建 更新 升级&#xff1a; 滚动升级&#x…