代码随想录训练营第十五天 110平衡二叉树 257二叉树的所有路径 404左子树之和 222完全二叉树的节点

本文主要是介绍代码随想录训练营第十五天 110平衡二叉树 257二叉树的所有路径 404左子树之和 222完全二叉树的节点,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

第一题:

原题链接:110. 平衡二叉树 - 力扣(LeetCode)

首先什么事平衡二叉树:平衡二叉树 是指该树所有节点的左右子树的深度相差不超过 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:bool isBalanced(TreeNode* root) {return height(root) == -1 ? false : true;}
private:int height(TreeNode* node){if(node == 0) return 0;int LeftHeight = height(node -> left);if(LeftHeight == -1) return -1;int rightHeight = height(node -> right);if(rightHeight == -1) return -1;return abs(rightHeight - LeftHeight) > 1 ? -1 : 1 + max(LeftHeight, rightHeight);}
};

第二题:

原题链接:257. 二叉树的所有路径 - 力扣(LeetCode)

这道题是看了视频才会做的。一开始思路是正确的,在实现添加“->”这个的时候出了问题,回溯没搞好。

使用回溯的方法:

本题使用前序遍历的方式,中左右。

当当前节点的左右节点都为的空的情况下证明这是一条完整的路径了,可以直接添加“->”然后加入res中。

先将中的节点元素添加进path中,然后向左和向右递归。在向左和向右递归之后要紧接着回溯。将元素弹出。

代码如下:

class Solution {
private:void traversal(TreeNode* cur, vector<int>& path, vector<string>& result) {path.push_back(cur->val); // 中,中为什么写在这里,因为最后一个节点也要加入到path中 // 这才到了叶子节点if (cur->left == NULL && cur->right == NULL) {string sPath;for (int i = 0; i < path.size() - 1; i++) {sPath += to_string(path[i]);sPath += "->";}sPath += to_string(path[path.size() - 1]);result.push_back(sPath);return;}if (cur->left) { // 左 traversal(cur->left, path, result);path.pop_back(); // 回溯}if (cur->right) { // 右traversal(cur->right, path, result);path.pop_back(); // 回溯}}public:vector<string> binaryTreePaths(TreeNode* root) {vector<string> result;vector<int> path;if (root == NULL) return result;traversal(root, path, result);return result;}
};

第三题:

原题链接:404. 左叶子之和 - 力扣(LeetCode)

思路:

参数和返回值都很好定义出来,参数就是根节点,返回值就是左叶子之和。

我们使用前序遍历的方式,那么当我们找到一个左叶子的时候,res加上该叶子的值即可。最后返回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:int res = 0;int sumOfLeftLeaves(TreeNode* node) {if(node -> left != nullptr && node -> left -> left == nullptr && node -> left -> right == nullptr){res += node -> left -> val;}if(node -> left) sumOfLeftLeaves(node -> left);if(node -> right) sumOfLeftLeaves(node -> right);return res;}
};

第四题:

原题链接:222. 完全二叉树的节点个数 - 力扣(LeetCode)

思路:

使用前序遍历的方式一直遍历,遇到节点就+1即可。

终止条件是当root为空的时候,返回0;

代码如下:

/*** 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 res = 0;int countNodes(TreeNode* root) {if(root == nullptr) return 0;res += 1;if(root -> left) countNodes(root -> left);if(root -> right) countNodes(root -> right);return res;}
};

这篇关于代码随想录训练营第十五天 110平衡二叉树 257二叉树的所有路径 404左子树之和 222完全二叉树的节点的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1080377

相关文章

MySQL进行数据库审计的详细步骤和示例代码

《MySQL进行数据库审计的详细步骤和示例代码》数据库审计通过触发器、内置功能及第三方工具记录和监控数据库活动,确保安全、完整与合规,Java代码实现自动化日志记录,整合分析系统提升监控效率,本文给大... 目录一、数据库审计的基本概念二、使用触发器进行数据库审计1. 创建审计表2. 创建触发器三、Java

Spring Boot中的路径变量示例详解

《SpringBoot中的路径变量示例详解》SpringBoot中PathVariable通过@PathVariable注解实现URL参数与方法参数绑定,支持多参数接收、类型转换、可选参数、默认值及... 目录一. 基本用法与参数映射1.路径定义2.参数绑定&nhttp://www.chinasem.cnbs

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

Visual Studio 2022 编译C++20代码的图文步骤

《VisualStudio2022编译C++20代码的图文步骤》在VisualStudio中启用C++20import功能,需设置语言标准为ISOC++20,开启扫描源查找模块依赖及实验性标... 默认创建Visual Studio桌面控制台项目代码包含C++20的import方法。右键项目的属性:

MySQL数据库的内嵌函数和联合查询实例代码

《MySQL数据库的内嵌函数和联合查询实例代码》联合查询是一种将多个查询结果组合在一起的方法,通常使用UNION、UNIONALL、INTERSECT和EXCEPT关键字,下面:本文主要介绍MyS... 目录一.数据库的内嵌函数1.1聚合函数COUNT([DISTINCT] expr)SUM([DISTIN

C++链表的虚拟头节点实现细节及注意事项

《C++链表的虚拟头节点实现细节及注意事项》虚拟头节点是链表操作中极为实用的设计技巧,它通过在链表真实头部前添加一个特殊节点,有效简化边界条件处理,:本文主要介绍C++链表的虚拟头节点实现细节及注... 目录C++链表虚拟头节点(Dummy Head)一、虚拟头节点的本质与核心作用1. 定义2. 核心价值二

Java实现自定义table宽高的示例代码

《Java实现自定义table宽高的示例代码》在桌面应用、管理系统乃至报表工具中,表格(JTable)作为最常用的数据展示组件,不仅承载对数据的增删改查,还需要配合布局与视觉需求,而JavaSwing... 目录一、项目背景详细介绍二、项目需求详细介绍三、相关技术详细介绍四、实现思路详细介绍五、完整实现代码

Go语言代码格式化的技巧分享

《Go语言代码格式化的技巧分享》在Go语言的开发过程中,代码格式化是一个看似细微却至关重要的环节,良好的代码格式化不仅能提升代码的可读性,还能促进团队协作,减少因代码风格差异引发的问题,Go在代码格式... 目录一、Go 语言代码格式化的重要性二、Go 语言代码格式化工具:gofmt 与 go fmt(一)

HTML5实现的移动端购物车自动结算功能示例代码

《HTML5实现的移动端购物车自动结算功能示例代码》本文介绍HTML5实现移动端购物车自动结算,通过WebStorage、事件监听、DOM操作等技术,确保实时更新与数据同步,优化性能及无障碍性,提升用... 目录1. 移动端购物车自动结算概述2. 数据存储与状态保存机制2.1 浏览器端的数据存储方式2.1.

基于 HTML5 Canvas 实现图片旋转与下载功能(完整代码展示)

《基于HTML5Canvas实现图片旋转与下载功能(完整代码展示)》本文将深入剖析一段基于HTML5Canvas的代码,该代码实现了图片的旋转(90度和180度)以及旋转后图片的下载... 目录一、引言二、html 结构分析三、css 样式分析四、JavaScript 功能实现一、引言在 Web 开发中,