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

题目链接:leetcode 110. 平衡二叉树

文章讲解:代码随想录 110. 平衡二叉树讲解

视频讲解:后序遍历求高度,高度判断是否平衡 | LeetCode:110.平衡二叉树

思路和解法

题目:
给定一个二叉树,判断它是否是高度平衡的二叉树。

本题中,一棵高度平衡二叉树定义为:

一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。
想法:
肯定是要遍历,那就用递归法,==这里总结一下心得,用递归法深度遍历就要考虑哪种遍历顺序,根据就是要做什么处理,比如这道题,要判断子树的信息,那就是后序遍历。==定义递归函数的意义:返回以传入节点为根节点的树的高度。一个细节就是判断是否为高度平衡二叉树,用-1表示不是,如果子节点不是高度平衡二叉树,那当前的节点也肯定不是了,算是一个小优化。然后就是本节点的处理:要算上当前节点,也就是高度+1再返回。

/*** 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 getHeight(TreeNode* node) {//终止条件 走到了空节点 返回高度0if (node == nullptr) {return 0;}//如果不是空节点,获取以子节点为根节点的树的高度,判断是否满足平衡二叉树,如果不满足,没有必要再计算int leftHeight = getHeight(node -> left);if (leftHeight == -1) return -1;int rightHeight = getHeight(node -> right);if (rightHeight == -1) return -1;//用-1代表不满足平衡二叉树if (abs(leftHeight - rightHeight) > 1) return -1;//如果满足平衡二叉树,返回以传入节点为根节点的树的高度return max(leftHeight, rightHeight) + 1;}bool isBalanced(TreeNode* root) {int result = getHeight(root);if (result == -1) return false;return true;}
};

题目链接:leetcode 257. 二叉树的所有路径

文章讲解:代码随想录 257. 二叉树的所有路径讲解

视频讲解:递归中带着回溯,你感受到了没?| LeetCode:257. 二叉树的所有路径

思路和解法

题目:
给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。

叶子节点 是指没有子节点的节点。
想法:
这里提及了回溯算法。我的理解就是有递归就要有回溯,但是是有前提的,前提就是只有当递归以后改变了传入参数的信息,并且传入参数在本次递归中还需要利用的就需要回溯,也就是把修改的内容去除掉。对于传值而非传递引用的递归函数就不需要回溯了。回溯只需要考虑递归一层以后的结果,不需要继续向下考虑,因为回溯操作在递归函数里,下一层的递归所需要的回溯在下一层递归函数里解决。

还有就是讲解中对于版本二的代码的讲解我认为有点问题,讲解中认为"->“是需要回溯的,但我认为不是真正意义的回溯,只是在本层处理中向下递归的入参不能错,而向我下面代码写的那样,”->"的添加放在if语句的外面就可以了,本质上pop操作的原因并不是递归引起的。

/*** 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:void traversal(TreeNode* node, vector<int>& path, vector<string>& result) {//处理当前节点path.push_back(node -> val);        //终止条件if (!node -> left && !node -> right) {//把path转化为一个结果放入resultstring s;//因为要加"->",最后一个要单独处理for (int i = 0; i < path.size() - 1; i++) {s += to_string(path[i]);s += "->";}s += to_string(path[path.size() - 1]);result.push_back(s);return ;}//递归+回溯if (node -> left) {traversal(node -> left, path, result);//此时path,result都被改变了,为了递归右节点,需要pop掉,//path加内容只考虑一层,因为这个函数是递归函数,在下一次调用的时候也会考虑到下下层的递归path.pop_back();}//因为对于上一层的递归,path在这里也被改了,所以为了上一层能返回正常结果,这里也要pop掉if (node -> right) {traversal(node -> right, path, result);path.pop_back();}return ;}vector<string> binaryTreePaths(TreeNode* root) {vector<string> result;vector<int> path;traversal(root, path, result);return result;}
};
//版本二
// class Solution {
// private:
//     void traversal(TreeNode* cur, string path, vector<string>& result) {
//         path += to_string(cur->val); // 中,中为什么写在这里,因为最后一个节点也要加入到path中
//         if (cur->left == NULL && cur->right == NULL) {
//             result.push_back(path);
//             return;
//         }
//         path += "->";
//         if (cur->left) {
//             traversal(cur->left, path, result); // 左
//             // path.pop_back(); // 回溯 '>'
//             // path.pop_back(); // 回溯 '-'
//         }
//         if (cur->right) {
//             // path += "->";
//             traversal(cur->right, path, result); // 右
//             // path.pop_back(); // 回溯'>'
//             // path.pop_back(); // 回溯 '-'
//         }
//     }// public:
//     vector<string> binaryTreePaths(TreeNode* root) {
//         vector<string> result;
//         string path;
//         if (root == NULL) return result;
//         traversal(root, path, result);
//         return result;//     }
// };

题目链接:leetcode 404.左叶子之和

文章讲解:代码随想录 404.左叶子之和讲解

视频讲解:二叉树的题目中,总有一些规则让你找不到北 | LeetCode:404.左叶子之和

思路和解法

题目:
给定二叉树的根节点 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为当前节点的所有左叶子之和 入参为当前节点,所以用题目给的函数作为递归函数即可//终止条件if (root == nullptr) {return 0;}//当前节点的处理逻辑 如何计算当前节点的左叶子之和 //递归计算当前节点的左子节点的左叶子之和,然后是右子节点的左叶子之和,加在一起int leftSum = sumOfLeftLeaves(root -> left);int rightSum = sumOfLeftLeaves(root -> right);//还有一部分就是判断左子节点本身是不是一个左叶子,如果是把该节点的值也加上if (root -> left && !root -> left -> left && !root -> left -> right) {return leftSum + rightSum + root -> left -> val;}return leftSum + rightSum;}
};

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

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

相关文章

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《考虑新能源配网三相不平衡治理的电动汽车充电策略》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 这个标题表明研究着重于开发一种电动汽车充电策略&#xff0c;该策略考虑了在新能源配电网络中存在的三相不平衡问题。解读如下&#xff1a; 电动汽车充…

Typora上传图片失败PicGo

起初我是在Typora中点击一键上传图片&#xff0c;结果如下&#xff0c;报错。可是我找了半天也没错啊。 最后发现原来是一个图片的命名问题&#xff0c;名字太过于复杂&#xff0c;PicGo识别不出&#xff0c;一个图片报错导致其它也上传不了。 我把它复制到其它文件夹之后&…

【QUARTZ】springboot+quartz动态配置定时任务

Quartz 介绍 Quartz 定时任务可分为Trigger&#xff08;触发器&#xff09;、Job&#xff08;任务&#xff09;和Scheduler&#xff08;调度器&#xff09;&#xff0c;定时任务的逻辑大体为&#xff1a;创建触发器和任务&#xff0c;并将其加入到调度器中&#xff0c;如下图所…

webpack原理和逆向实战

文章目录 什么是webpackwebpack基本原理webpack代码分析webpack代码抠取webpack全模块自吐webpack自动扣取总结 什么是webpack webpack是一个现代 JavaScript 应用程序的静态模块打包器(module bundler)&#xff0c;负责分析翻译压缩打包代码。 上面的官网的一张示例图。 web…

大数据实时抓取软件:Maxwell学习网站的高效框架!

介绍&#xff1a;Maxwell是由美国Zendesk开源的&#xff0c;使用Java编写的MySQL实时抓取软件。它能够实时读取MySQL的二进制日志&#xff08;Binlog&#xff09;&#xff0c;并将这些信息生成为JSON格式的消息。进一步地&#xff0c;Maxwell将这些消息作为生产者发送给Kafka、…

Springboot项目Nacos做配置中心

Springboot项目Nacos做配置中心 说明安装2.Springboot整合使用Nacos3.问题处理 说明 文档参考 Nacos Spring Boot 安装 查看nacos镜像 docker search nacos 下载镜像 docker pull nacos/nacos-server启动naocs镜像 docker run --env MODEstandalone --name nacos -d -p 8…

Abaqus2023安装下载教程

用钢铁意志&#xff0c;成就不平凡的人生。 今天博主整理了一下Abaqus2023安装下载教程&#xff0c;希望大家学习。 安装之前请关闭电脑所有杀毒软件和防火墙&#xff0c;并保证计算机名不是中文&#xff01;&#xff01;&#xff01;&#xff01; 1.首先创建一个用于Abaqus…

MySQL夯实之路-MVCC机制深入浅出

多版本并发控制&#xff08;MVCC&#xff0c;multiversion concurrency control&#xff09; MVCC用更加灵活的方式处理并发&#xff0c;实现了读不加锁&#xff0c;读写不冲突。保证了事务的隔离性&#xff08;可重复读&#xff09;&#xff0c;避免了不可重复读问题。 数据…

go中拷贝文件操作

一. 拷贝文件内容到另一个文件位置 // 拷贝文件内容到另一个文件里面 func copyContent() {filepath1 : "d:/abc.txt"filepath2 : "e:/eee.txt"// 读取内容data, err : os.ReadFile(filepath1) // 使用os.ReadFile函数读取指定路径的文件内容if err ! nil…

MyBatis面试题及高级用法

问题1: 请介绍一下MyBatis&#xff0c;以及它的主要特点是什么&#xff1f; 答案1: MyBatis是一个Java持久层框架&#xff0c;通过将SQL语句映射到对象&#xff0c;简化了数据库访问。它的主要特点包括动态SQL生成、自动参数映射和复杂映射支持。 问题2: MyBatis和其他ORM框架…

HTML常用标签

基本 <html>…</html> 定义 HTML 文档 <head>…</head> 文档的信息 <meta> HTML 文档的元信息 <title>…</title> 文档的标题 <link> 文档与外部资源的关系 <styl…

【Linux】进程程序替换

👑作者主页:@安 度 因 🏠学习社区:安度因 📖专栏链接:Linux 文章目录 简单看看程序替换原理(单进程)多进程进程程序替换补充exec 系列进程创建时有两个目标: 执行父进程的部分代码,由自己编写的,通过 if else 分流,让子进程执行的对应任务。执行和父进程完全不同…

Linux上如何一键安装软件?yum源是什么?Linux如何配置yum源?

这几个问题是Linux操作的入门问题&#xff0c;但是确实也会让刚上手Linux小伙伴头疼一阵&#xff0c;故特有此文&#xff0c;希望能对刚入门的小伙伴有一些帮助~ 众所周知 在linux上在线安装软件需要用到yum命令&#xff0c;经常下述命令来安装 yum install [-y] 包名 #-y的…

Hive基础知识(十二):Hive的基本查询

1. 全表和特定列查询 0&#xff09;数据准备 原始数据 dept: 10 ACCOUNTING 1700 20 RESEARCH 1800 30 SALES 1900 40 OPERATIONS 1700 emp&#xff1a; 7369 SMITH CLERK 7902 1980-12-17 800.00 20 7499 ALLEN SALESMAN 7698 1981-2-20 1600.00 300.00 30 7521 WARD SALESM…

解决POI报错POIXMLTypeLoader不存在的问题

问题&#xff1a; springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.NoClassDefFoundError: org/apache/poi/POIXMLTypeLoaderat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet…

Flyio封装API接口(uniapp开发微信小程序)

Flyio封装API接口 1&#xff09;flyio 是什么? 2&#xff09;flyio能干什么&#xff1f; 3&#xff09;flyio使用 1&#xff09;flyio 是什么? 一个支持所有JavaScript运行环境的基于Promise的、支持请求转发、强大的http请求库。可以让您在多个端上尽可能大限度的实现代码…

数据结构与算法教程,数据结构C语言版教程!(第三部分、栈(Stack)和队列(Queue)详解)五

第三部分、栈(Stack)和队列(Queue)详解 栈和队列&#xff0c;严格意义上来说&#xff0c;也属于线性表&#xff0c;因为它们也都用于存储逻辑关系为 "一对一" 的数据&#xff0c;但由于它们比较特殊&#xff0c;因此将其单独作为一章&#xff0c;做重点讲解。 使用栈…

Java Swing 图书借阅系统 窗体项目 期末课程设计 窗体设计

视频教程&#xff1a; 【课程设计】图书借阅系统 功能描述&#xff1a; 图书管理系统有三个角色&#xff0c;系统管理员、图书管理员、借阅者&#xff1b; 系统管理员可以添加借阅用户&#xff1b; ​图书管理员可以添加图书&#xff0c;操作图书借阅和归还&#xff1b; 借…

c++例题2点和直线关系

#include<iostream> #include<string> using namespace std; //圆的类 class yuan{ public:int x2 10;int y2 10;int r 5; }; //点的类 class dian{ public :void setx(int x){x1 x;}int getx(){return x1;}void sety(int y){y1 y;}int gety(){return y1;} pr…

Lagrange对偶法

这里写自定义目录标题 5.1.1 The Lagrangian5.1.2 The Lagrange dual function5.2 The Lagrange dual problem5.2.3 Strong duality and Slater’s constraint qualification5.2.3 Strong duality and Slater’s constraint qualification5.5.3 KKT optimality conditions Lagr…