【代码随想录】刷题Day17

news2024/9/26 1:17:20

1.AVLTree判断

110. 平衡二叉树

后序遍历的强化理解:

所谓后续遍历,不仅仅是一种遍历,其实它是完成了所有左右子树的递归。后续遍历能将自己所求的值返回给上层节点。这在比较中很关键,举个例子,我们能得到下边节点返回给上面节点的层数,那么就能进行高度的比较。

本题其实也是一样的思路:

1.我想设计一个算法,使得每一个节点的高度,那么后续遍历能完成该任务。是否平衡的比较落在左右节点之差上,最后如果不是AVL树,那我们返回-1。

2.返回值为int型,因为我们需要统计每一层的节点高度;传入的参数为树的节点

3.结束递归依据为root是否走到nullptr,如果根节点为空,此时走到底部,返回给上层为0,因为该位置没有节点

4.我们使用后续遍历,那么对应的定义left变量接收左边的高度,并且如果左边高度为-1,说明此时下面传回的信息是“已经不是平衡二叉树”,那么后续其实已经不需要操作了,那么我们直接返回-1,往上告知该树不是平衡二叉树;对应的定义right变量接收右边的高度,遇到-1的情况与左子树一样处理。

5.最后我们执行中间操作:如果左边-右边的绝对值绝对高度差大于1,说明此时不平衡,直接返回-1;如果不是,那么我们要返回上层的高度,所以我们要比较左右节点高度谁大,将大的值进行加一再返回,加一操作是因为上层节点也是一个高度,所以上层得到自己的高度是下面高度加上自己节点的高度。

class Solution {
public:
    int _isBalancedR(TreeNode* root)
    {
        if(root==nullptr)
            return 0;
        int left = _isBalancedR(root->left);
        if(left==-1)
            return -1;
        int right = _isBalancedR(root->right);
        if(right==-1)
            return -1;
        int ret;
        if(abs(left-right)>1)
            return -1;
        return ret=(left>right)?left+1:right+1;
    }
    bool isBalanced(TreeNode* root) {
        if(_isBalancedR(root)==-1)
            return false;
        return true;
    }
};

2.二叉树的所有路径

257. 二叉树的所有路径

大体思路:我想通过传递string的变量,使得每一层都有不同的string继承上面传来的路径

1.实现该函数传入的参数为:根节点,引用参数vector<string> vs和string s,由于我们只需要对s收获的路径存储到引用vs中,所以不需要进行什么传回操作,因此我们函数返回void

2.返回条件,这题与之前的最小深度思路有点重合:”就是如果一个节点左右有一个节点为空,但是另一个不为空,此时往空节点那里走是不会触发存储条件的!!!这点很重要,是树的减枝操作“;所以我们不仅要判断节点是否为空,还要判断节点的左右节点是否为空。因此返回条件有两种:一、如果当前节点不为空,但是左右节点为空,说明该节点为叶子节点,那么我们需要把这个路径存储下来,再返回  二、如果当前节点为空,此时已经过了条件一的判断,说明这种路径是需要被减枝的,所以直接返回即可

3.我们使用的是前序遍历,因为这样我们才能得到遍历的叶子节点数据,那操作很简单:就是将root的val存储到s中,随后左右遍历

4.s中存储数据需要注意,如果是中间操作,那么我们要加上题目要求的”->“标记,如果在叶子节点,那么说明此时不需要加”->“标记

class Solution {
public:
    void _GetTreePathR(TreeNode* root,vector<string>& vs,string s)
    {
        if(root&&root->left==nullptr&&root->right==nullptr)
        {
            s+=(to_string(root->val));
            vs.push_back(s);
            return;
        }
        if(root==nullptr)
            return;
        s+=(to_string(root->val)+"->");
        _GetTreePathR(root->left,vs,s);
        _GetTreePathR(root->right,vs,s);
    }
    vector<string> binaryTreePaths(TreeNode* root) {
        vector<string> vs;
        string s;
        _GetTreePathR(root,vs,s);
        return vs;
    }
};

这种通过string临时遍历保存每一层的操作确实简单,但是它浪费空间啊,每一层都保存一个string,要是节点多,爆内存是迟早的事情。所以优化的目标就是把string也变成引用参数,这样我们开辟的就只有一个string了。不过此时对应的就是要把sting往上返回时,减去一些数据。

无非就是用一个tmp存储,在走到vs存储后,将s剪掉后面的数据;当一层遍历结束,返回上层时,把对应的数据删除

class Solution {
public:
    void _GetTreePathR(TreeNode* root,vector<string>& vs,string& s)
    {
        if(root&&root->left==nullptr&&root->right==nullptr)
        {
            string tmp = to_string(root->val);
            s+=(tmp);
            vs.push_back(s);
            s.erase(s.end()-tmp.size(),s.end());
            return;
        }
        if(root==nullptr)
            return;
        string tmp = to_string(root->val)+"->";
        s+=(tmp);
        _GetTreePathR(root->left,vs,s);
        _GetTreePathR(root->right,vs,s);
        s.erase(s.end()-tmp.size(),s.end());
    }
    vector<string> binaryTreePaths(TreeNode* root) {
        vector<string> vs;
        string s;
        _GetTreePathR(root,vs,s);
        return vs;
    }
};

3.左叶子之和

404. 左叶子之和

这道题所说的左叶子特征:

1.该节点没有左右节点

2.该节点为父节点的左节点

所以描述成代码就是:当前位置不为空,当前位置的左节点不为空,当前位置的左节点没有子节点

class Solution {
public:
    void _GetSumR(TreeNode* root,int& sum)
    {
        if(root&&root->left&&!(root->left->left)&&!(root->left->right))
            sum+=root->left->val;
        if(root==nullptr)
            return;
        _GetSumR(root->left,sum);
        _GetSumR(root->right,sum);
    }
    int sumOfLeftLeaves(TreeNode* root) {
        int sum = 0;
        _GetSumR(root,sum);
        return sum;
    }
};

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

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

相关文章

Makefile教程(Makefile的结构)

文章目录 前言一、Makefile的结构二、深入案例三、Makefile中的一些技巧总结 前言 一、Makefile的结构 Makefile 通常由一系列规则组成&#xff0c;每条规则定义了如何从源文件生成目标文件。每个规则又由目标、依赖和命令三部分组成。 下面是 Makefile 规则的基本结构&…

Matlab官方的两个配色colormap补充包

目录 一、othercolor 1、使用方法 2、图示 二、slanCM 1、使用方法 2、图示 三、从matlab上下的函数如何使用 一、othercolor 下载地址&#xff1a;matlab_othercolor.zip 1、使用方法 不指定获取颜色个数会默认256色&#xff0c;举例获取[163]号彩虹色(rainbow)&…

Java阶段二Day15

Java阶段二Day15 文章目录 Java阶段二Day15复习前日知识点对象数据类型注入数组类型注入集合类型的注入p命名空间引入外部属性文件 基于XML管理beanbean的作用域bean的生命周期代码演示生命周期后置处理器处理展示基于XML的自动装配 基于注解管理bean开启组件扫描使用注解定义B…

【A200】 TX1核心 JetPack4.6.2版本如何修改DTB文件测试全部SPI

大家好&#xff0c;我是虎哥&#xff0c;很长时间没有发布新内容&#xff0c;主要是这段时间集中精力&#xff0c;研究DTB设备树的修改&#xff0c;以适配不同载板&#xff0c;同时也是专门做了一个TX1&TX2核心&#xff0c;双网口&#xff0c;可以使用SPI 扩展CAN接口的载板…

java获取resources路径的方法

我们在写程序的时候&#xff0c;有时候会发现代码不能正常运行&#xff0c;出现提示异常的问题&#xff0c;这就说明我们的代码没有执行完&#xff0c;也就是没有 resource&#xff0c;其实遇到这种情况&#xff0c;我们只需要把代码重新执行一遍即可。 在 java中是可以实现 re…

【计算机组成原理笔记】计算机的基本组成

计算机的基本组成 文章目录 计算机的基本组成冯诺伊曼计算机的特点硬件框图以运算器为核心的计算机现代计算机系统复杂性管理的方法 计算机的工作步骤存储器运算器控制器I/0 脚注 冯诺伊曼计算机的特点 五大部件组成 运算器存储器控制器输入设备输出设备 指令和地址以同等地位…

基于CUDA的GPU计算PI值

访问【WRITE-BUG数字空间】_[内附完整源码和文档] 基于CUDA的GPU计算PI值。本项目使用CUDA编程模型并行计算PI值&#xff0c;研究GPU与CPU效率的比较&#xff0c;分析不同GPU线程分块对性能的影响。 异构计算试验报告 —实验1&#xff1a;基于CUDA的GPU计算PI值 第一部分&…

原型模式--深拷贝和浅拷贝

定义 Specify the kind of objects to create using a prototypical instance, and create new objects by copying this prototype. &#xff08;使用原型实例指定将要创建的对象类型&#xff0c;通过复制这个实例创建新的对象。&#xff09; 从定义中我们我们可以发现&#x…

2023年4月Web3行业月度发展报告区块链篇 | 陀螺科技会员专享

4月&#xff0c;以太坊上海升级与香港Web3动向成最大热点&#xff0c;上海升级的完成是转POS的重要里程碑&#xff0c;从市场而言&#xff0c;由于升级解锁质押ETH是否引发抛压备受关注&#xff0c;仅以交易表现来看&#xff0c;并未出现大范围的抛压与离场。另一方面&#xff…

算力提升+AIGC,是驱动元宇宙发展的核心引擎|数据猿直播干货分享

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 “元宇宙”是美国科幻小说家尼奥斯蒂文森1992年在《雪崩》中提出的概念&#xff0c;书中设定现实世界中的人在网络世界中都有一个分身&#xff0c;这个由分身组成的世界就是“元宇宙”。如今&#xff0c;随着虚拟现实技术的…

60+开箱即用的工具函数库xijs更新指南(v1.2.5)

xijs 是一款开箱即用的 js 业务工具库, 聚集于解决业务中遇到的常用函数逻辑问题, 帮助开发者更高效的开展业务开发. 接下来就和大家一起分享一下v1.2.5 版本的更新内容以及后续的更新方向. 贡献者列表: 1. 数据深拷贝cloneDeep 该模块主要由 20savage 贡献, 支持 symbol, map,…

BM58-字符串的排列

题目 输入一个长度为 n 字符串&#xff0c;打印出该字符串中字符的所有排列&#xff0c;你可以以任意顺序返回这个字符串数组。 例如输入字符串ABC,则输出由字符A,B,C所能排列出来的所有字符串ABC,ACB,BAC,BCA,CBA和CAB。 数据范围&#xff1a;n < 10。 要求&#xff1a;空…

[架构之路-191]-《软考-系统分析师》-8-软件工程 - 解答什么是面向功能的结构化程序设计:算法+数据结构 = 程序

目录 1. 什么是结构化程序设计 2. 结构化程序设计的局限性 3.程序设计的三种基本结构 (1) 顺序结构 (2) 选择结构 (3) 循环结构 1. 什么是结构化程序设计 功能 》 Function 》 函数 》 算法 数据流Data Flow 》 数据结构Data Strucuture 程序 算法 数据结构 》 数…

36. Kubernetes 网络原理——CNI 网络插件

本章讲解知识点 Flannel 原理概述直接路由的原理和部署示例Calico 插件原理概述1. Flannel 原理概述 Flannel 是一个用于容器网络的开源解决方案,它使用了虚拟网络接口技术(如 VXLAN)和 etcd 存储来提供网络服务。它的原理概述如下: Flannel 协助 Kubernetes,给每一个 No…

界面交互篇:答题页的答题逻辑交互开发

微信小程序云开发实战-答题积分赛小程序 界面交互篇:答题页的答题逻辑交互开发 前面的那一篇文章,我们已经完成了使用云开发的聚合能力实现从题库中随机抽取题目功能。 在页面加载时,实现从题库中随机抽取题目功能。那么,拿到数据后要干什么?如何做? 动态数据绑定 实…

c++练习题

1、默认参数练习 创建默认参数函数 void stars(int cols ,int rows ) 该函数默认缺省值cols是10 rows是1。该函数完成功能是根据行和列数显示一个由星号组成的矩形。在main函数仲按照默认值调用该函数。按照cols是5调用该函数。按照列数和行数是7&#xff0c;3 调用该函数 #…

【MMdetection训练及使用脚本系列】MMdetection训练1——如何保存最优的checkpoint文件

MMdetection如何保存最优的checkpoint文件 以目标检测为例&#xff0c;进入到 configs/_base_/datasets/coco_detection.py将evaluation dict(interval1, metricbbox)改为evaluation dict(interval1, metricbbox, save_bestauto)即可。 但是不建议这样做&#xff0c;防止以…

软件设计师笔记--数据结构

文章目录 前言学习资料数据结构大 O 表示法时间复杂度线性结构和线性表线性表的顺序存储线性表的链式存储栈的顺序存储栈的链式存储队列的顺序存储与循环队列 串KMP 数组矩阵树二叉树二叉树的顺序存储结构二叉树的链式存储结构二叉树的遍历平衡二叉树二叉排序树最优二叉树(哈夫…

C/C++每日一练(20230507) 数列第n项值I/II、简化路径

目录 1. 求数列的第n项的值 ※ 2. 求数列的第n项的值 II ※ 3. 简化路径 &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 求数列的第n项的值 已知数列…

摘要:PostgreSQL开发技术基础:过程与函数

原文地址 6.0 Language SQL与PL/pgSQL PL / PgSQL是基于SQL的特定于PostgreSQL的过程语言 。它有循环&#xff0c;variables&#xff0c;错误/exception处理等等。并不是所有的SQL都是有效的PL / PgSQL&#xff0c;正如你发现的那样&#xff0c;例如&#xff0c;你不能在没有…