代码随想录算法训练营第十七天 | 110.平衡二叉树,257. 二叉树的所有路径,404.左叶子之和

在这里插入图片描述
递归法,考虑当我站在一个节点上时,我应该干点啥,是不是想知道是否是平衡二叉树,就得知道左右子树的高度,进一步判断这个节点下是不是平衡的,天然的就是一个后序遍历的场景,从左右子树收集信息

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    bool res = true;
    int traceback(TreeNode * node){
          if(node == NULL){
            return 0;
          }

        int leftHigh =   traceback(node->left);
        int rightHigh =  traceback(node->right);

        if(abs(leftHigh - rightHigh) > 1){
           res = false;
        }
        return max(leftHigh,rightHigh) + 1;
    }
    bool isBalanced(TreeNode* root) {
        traceback(root);
        return res;
    }
};

如果想改成迭代法,就可以使用栈的数据结构,来调整各个节点的次序,后序遍历的迭代法大框架下改改就行

在这里插入图片描述
在这里插入图片描述
同样的,递归时同样是看:当我站在一个节点上时,我该干啥,是不是直接把现在的值记录一下就行,后面有没有节点,子树长啥样,管不着(这个时候是不是感觉有点先序遍历的意思)

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    vector<string> paths;
    void traceback(TreeNode * node,string path){
        if(node == NULL){
            return;
        }
        path += to_string(node->val);
        path += "->";
        if(node->left == NULL && node->right == NULL){
             path.pop_back();
             path.pop_back();
             paths.push_back(path);
        }
        traceback(node->left,path);
        traceback(node->right,path);
    }
    vector<string> binaryTreePaths(TreeNode* root) {
        traceback(root,"");
        return paths;
    }
};

迭代法就是在先序遍历迭代法的大框架下改改,需要注意的是,每次是遇到了一个确切的叶子节点才是记录路径的时机

在这里插入图片描述
在这里插入图片描述
继续考虑这个问题,当我站在一个节点上时,我该干啥,要返回左叶子的和,是不是现在要有当前节点的左子树的左叶子和,以及右子树的左叶子和,还有当前节点的左叶子和那么后序遍历次序定下来了

递归的话先确定一下形参和返回值,形参(就根节点一个自变量),返回值(当然是当前节点的左叶子和咯),次序为后序遍历

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    int traceback(TreeNode * node){
         if(node == NULL){
            return 0;
         }
         int levesSum = 0;

         int levesSumL = traceback(node->left);
         int levesSumR = traceback(node->right);

         levesSum = levesSumL + levesSumR;
         if(node->left && node->left->left == NULL && node->left->right == NULL){
             levesSum += node->left->val;
         }
         return levesSum;

    }
    int sumOfLeftLeaves(TreeNode* root) {
         return traceback(root);
    }
};

非递归的话可以在后序遍历的迭代法框架下改改,也可以在层序遍历框架下改

层序遍历,记录下各个入队列的左节点是否为左叶子,累加

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    int sumOfLeftLeaves(TreeNode* root) {
        int res = 0;
        queue<TreeNode *> q;

        if(root == NULL){
          return res;
        }
        q.push(root);

        while(!q.empty()){
            int size = q.size();

            while(size--){
                TreeNode * node = q.front();
                q.pop();
                if(node->left){
                    q.push(node->left);
                    if(node->left->left == NULL && node->left->right == NULL){
                           res += node->left->val;
                    }
                }
                if(node->right){
                   q.push(node->right);
                }
            }

        }
        return res;
    }
};

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

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

相关文章

《JAVA与模式》之观察者模式

系列文章目录 文章目录 系列文章目录前言一、观察者模式的结构二、推模型和拉模型三、JAVA提供的对观察者模式的支持四、怎样使用JAVA对观察者模式的支持前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男…

推荐两本C语言学习的书籍

提高学生应对未来专业实践课程的兴趣和信心。 C程序设计 | 谭浩强 由谭浩强教授著、清华大学出版社出版的《C程序设计》经过近三十年一千多万读者的实践检验&#xff0c;被公认为学习C语言程序设计的经典教材。根据C语言的发展和计算机教学的需要&#xff0c;作者在《C程序设计…

AtCoder Beginner Contest 343(A,B,C,D,E,F)

比赛链接 CE是暴力&#xff0c;D是数据结构题&#xff0c;F是线段树。这场的E比较有意思&#xff0c;其他的感觉有点水。 A - Wrong Answer 题意&#xff1a; 给你两个数 A , B A,B A,B ( 0 ≤ A , B ≤ 9 ) (0\le A,B\le 9) (0≤A,B≤9)&#xff0c;返回一个个位数&#…

嵌入式学习day34 网络

TCP包头: 1.序号:发送端发送数据包的编号 2.确认号:已经确认接收到的数据的编号(只有当ACK为1时,确认号才有用) TCP为什么安全可靠: 1.在通信前建立三次握手连接 SYN SYNACK ACK 2.在通信过程中通过序列号和确认号保障数据传输的完整性 本次发送序列号:上次…

vis.js network操作学习

前言 网络是显示网络以及由节点和边组成的网络的可视化。可视化易于使用&#xff0c;并支持自定义形状、样式、颜色、尺寸、图像等。网络可视化可以在任何现代浏览器上顺利运行&#xff0c;最多可显示数千个节点和边缘。为了处理大量节点&#xff0c;网络提供了集群支持。Netw…

南京观海微电子---PCIe协议(一)

概述 PCIe协议是一种端对端的互连协议&#xff0c;提供了高速传输带宽的解决方案。与传统的并行总线标准如PCI和PCI-X相比&#xff0c;PCIe提供了更低的延迟和更高的数据传输速率。每个连接到主板上的设备都通过独立的点对点连接与之相连&#xff0c;这避免了设备之间因为共享…

四信全球化拓展再启新篇!LoRa传感器与云平台领航智能感知时代

随着科技浪潮的不断推进&#xff0c;物联网已逐渐融入我们的生活。刚刚结束的MWC24盛会上&#xff0c;四信带来了一系列前沿技术成果&#xff0c;不仅将5G技术成功扩展至当前市场主流类型的终端&#xff0c;更携手联通、ASR等业界巨头&#xff0c;在连接、5G RedCap、AI、LoRa以…

Lim接口测试平台开展自动化的优势

一、数据对比 使用Lim接口测试平台后&#xff0c;相比以往采用Postman或excel关键字驱动带来的效率提升&#xff1a; 编写效率提升300%&#xff0c;原来10个步骤的用例&#xff0c;一个工作日调试编写只能输出6条&#xff0c;现在一天能输出18条。维护成本复杂度降低100%&…

webpack5零基础入门-1使用webpack打包

感谢大家的点赞和转发&#xff0c;欢迎大家关注本人的博客。试用期指导&#xff0c;项目开发&#xff0c;简历优化&#xff0c;毕业设计/论文&#xff0c;欢迎添加本人微信。 新人作者&#xff0c;欢迎关注和收藏&#x1f44f;&#x1f3fb;&#x1f44f;&#x1f3fb; 1.为什么…

基于R语言lavaan结构方程模型(SEM)技术应用

结构方程模型&#xff08;Sructural Equation Modeling&#xff0c;SEM&#xff09;是分析系统内变量间的相互关系的利器&#xff0c;可通过图形化方式清晰展示系统中多变量因果关系网&#xff0c;具有强大的数据分析功能和广泛的适用性&#xff0c;是近年来生态、进化、环境、…

【研究生复试】计算机软件工程人工智能研究生复试——资料整理(速记版)——计算机组成原理

1、JAVA 2、计算机网络 3、计算机体系结构 4、数据库 5、计算机组成原理 6、软件工程 7、大数据 8、英文 自我介绍 5. 组成原理 1. 计算机系统概论 1. 发展历史 早期计算器: 算盘->算筹-> 计算尺(工程师的身份象征)-> 机械计算机: 图灵:计算机世界的理论基…

(黑马出品_05)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式

&#xff08;黑马出品_05&#xff09;SpringCloudRabbitMQDockerRedis搜索分布式 微服务技术分布式搜索 今日目标1.初识elasticsearch1.1.了解ES1.1.1.elasticsearch的作用1.1.2.ELK技术栈1.1.3.elasticsearch和lucene1.1.4.为什么不是其他搜索技…

学习Java的第四天

目录 一、if选择结构 1、基本if选择结构 语法结构&#xff1a; 流程图&#xff1a; 示例&#xff1a; 2、if-else 选择结构 语法结构&#xff1a; 流程图&#xff1a; 示例&#xff1a; 3、多重if选择结构 语法结构&#xff1a; 流程图&#xff1a; 示例&#xff1a…

防御保护IPSEC实验

要求&#xff1a;在FW5和FW3之间建立一条IPSEC通道&#xff0c;保证10.0.2.0/24网段可以正常访问到192.168.1.0/24. 因为是双机热备状态则只需要配置FW1主设备。 新建ACL待加密数据流 安全建议&#xff1a; IPSec参数配置 FW3配置如下与FW1类似&#xff1a; FW1中新建安全策略…

VS配置开发与远程调试笔记

先简单写一下&#xff0c;后续详细补充 场景&#xff1a;本地机器开发&#xff0c;虚拟机调试 准备工作&#xff1a; 由于要将生成的文件生成在虚拟机&#xff0c;避免反复拷贝&#xff0c;直接配置虚拟机共享文件夹进行写入&#xff0c;步骤如下&#xff1a; 虚拟机打开网…

Python 创建PPT

本篇为如何使用Python来创建ppt文件。 创建PPT 安装必要的库 命令如下&#xff1a; pip install python-pptx 安装过程&#xff1a; 创建ppt文件 在当前目录下创建一个test的ppt文件。其中包含两页&#xff0c;分别使用了不同的布局。 第一页设置了标题和内容。第二页只设…

AutoPSA里给定了弹簧刚度,为什么计算没有引用?

山东一用户问&#xff1a;已经给定了弹簧刚度&#xff0c;为什么计算没引用&#xff1f; 在AutoPSA里包含两种算法仿CAESARII &#xff0c;仿GLIF算法。 在仿CAESARII算法里直接给定弹簧刚度与安载荷载&#xff0c;两个都给了相应值&#xff0c;也就是给定了弹簧号&#xff1b…

Python自动化测试:API接口自动化——requests、webSocket

接口自动化测试1 一、requests二、简单示例1.导入/引入库2.请求与响应示例1>简单访问百度主页-GET请求2>简单的登录请求-POST请求3>保存cookies至头信息headers4>其他接口请求时携带headers 三、webSocketwebSocket连接与数据收发示例 本文介绍了借助Python的reque…

ssGSEA -- 学习记录

文章目录 biref统计学原理其他注意事项代码实现部分 biref 前情提要链接&#xff1a; https://blog.csdn.net/jiangshandaiyou/article/details/136536349 https://blog.csdn.net/jiangshandaiyou/article/details/134457515 相比起GSA&#xff0c;GSEA不再关注于差异基因&…

【C++干货基地】面向对象核心概念 | 访问限定符 | 类域 | 实例化 | 类对象模型

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引入 哈喽各位铁汁们好啊&#xff0c;我是博主鸽芷咕《C干货基地》是由我的襄阳家乡零食基地有感而发&#xff0c;不知道各位的…
最新文章