当前位置: 首页 > news >正文

代码随想录算法训练营第十五天(一)| 110.平衡二叉树 (优先掌握递归)257. 二叉树的所有路径

110.平衡二叉树 

题目:

给定一个二叉树,判断它是否是 平衡二叉树

  

示例 1:

输入:root = [3,9,20,null,null,15,7]
输出:true

示例 2:

输入:root = [1,2,2,3,3,null,null,4,4]
输出:false

示例 3:

输入:root = []
输出:true

提示:

  • 树中的节点数在范围 [0, 5000] 内
  • -104 <= Node.val <= 104

思路:

首先了解一下概念:平衡二叉树

平衡二叉树(Balanced Binary Tree)是指一棵二叉树中每个节点的左右子树的高度差不超过1。换句话说,二叉树中的任意节点的左右子树的高度差最多为1,并且左右子树本身也是一棵平衡二叉树。

要判断一棵二叉树是否是平衡二叉树,可以使用递归的方法来检查每个节点的左右子树的高度差。如果某个节点的左右子树高度差超过1,那么这棵树就不是平衡二叉树。

递归的思路:

  1. 对于每个节点,递归地计算它的左右子树的高度。
  2. 如果某个节点的左右子树的高度差超过1,返回 false
  3. 如果所有节点的左右子树高度差都不超过1,返回 true

上代码:

/*** 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 height(TreeNode* root) {// 如果当前节点为空,返回高度0if (root == nullptr) return 0;// 递归计算左子树的高度int leftHeight = height(root->left);// 如果左子树不平衡,直接返回-1if (leftHeight == -1) return -1;// 递归计算右子树的高度int rightHeight = height(root->right);// 如果右子树不平衡,直接返回-1if (rightHeight == -1) return -1;// 判断当前节点是否平衡if (abs(leftHeight - rightHeight) > 1) {return -1; // 不平衡返回-1}// 返回当前节点的高度return max(leftHeight, rightHeight) + 1;}// 主函数:判断二叉树是否平衡bool isBalanced(TreeNode* root) {// 调用辅助函数,如果高度函数返回-1,表示不平衡return height(root) != -1;}
};

257. 二叉树的所有路径

题目:

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

叶子节点 是指没有子节点的节点。

 

示例 1:

输入:root = [1,2,3,null,5]
输出:["1->2->5","1->3"]

示例 2:

输入:root = [1]
输出:["1"]

提示:

  • 树中节点的数目在范围 [1, 100] 内
  • -100 <= Node.val <= 100

思路:

要找出二叉树中所有从根节点到叶子节点的路径,我们可以使用深度优先搜索(DFS)的方法进行遍历。在遍历过程中,记录从根节点到当前节点的路径,当到达叶子节点时,将这条路径记录下来。

递归思路:

  1. 使用递归函数 dfs,从根节点开始,沿着每一条路径进行深度优先搜索。
  2. 在每次递归调用中,将当前节点的值添加到路径中。
  3. 如果当前节点是叶子节点(没有左子树和右子树),将路径转换为字符串并存储到结果列表中。
  4. 如果当前节点有子节点,继续递归遍历其子节点,传递当前路径。
  5. 最后返回结果列表。

上代码:

/*** 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:// 辅助函数:使用DFS遍历每条从根到叶子节点的路径void dfs(TreeNode* node, string path, vector<string>& paths) {if (!node)return; // 如果节点为空,直接返回// 将当前节点的值加入到路径中path += to_string(node->val);// 如果当前节点是叶子节点,则将路径添加到结果列表中if (!node->left && !node->right) {paths.push_back(path);} else {// 如果不是叶子节点,继续向下遍历,并在路径中添加 "->"path += "->";dfs(node->left, path, paths);dfs(node->right, path, paths);}}vector<string> binaryTreePaths(TreeNode* root) {vector<string> paths;if (root) {dfs(root, "", paths); // 从根节点开始进行DFS}return paths;}
};

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【安全工具推荐-Search_Viewer资产测绘】
  • 欺诈文本分类微调(一):基座模型选型
  • 使用Gitlab实现monorepo多项目CICD
  • 一文HDMI (High-Definition Multimedia Interface)
  • spring常见面试题
  • React 学习——react项目中加入echarts图
  • 【ARM CoreLink 系列 4.2 -- NIC-400 控制器详细介绍】
  • Java语言程序设计——篇十三(1)
  • 浅述TSINGSEE青犀EasyCVR视频汇聚平台与海康安防平台的区别对比
  • Python生成缩略图
  • C++初阶_2: inline内联函数 宏函数
  • C# 设计模式之策略模式
  • 多点通信
  • 子组件数据回显
  • 量化策略开发步骤系列(4)参数分析和过度拟合
  • CentOS6 编译安装 redis-3.2.3
  • DataBase in Android
  • echarts的各种常用效果展示
  • emacs初体验
  • JS基础之数据类型、对象、原型、原型链、继承
  • PHP 7 修改了什么呢 -- 2
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • V4L2视频输入框架概述
  • 初探 Vue 生命周期和钩子函数
  • 悄悄地说一个bug
  • 用mpvue开发微信小程序
  • 怎样选择前端框架
  • ​​​​​​​STM32通过SPI硬件读写W25Q64
  • "无招胜有招"nbsp;史上最全的互…
  • # Pytorch 中可以直接调用的Loss Functions总结:
  • #162 (Div. 2)
  • #pragma once与条件编译
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • (4)logging(日志模块)
  • (42)STM32——LCD显示屏实验笔记
  • (6)添加vue-cookie
  • (7)摄像机和云台
  • (C语言)字符分类函数
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (八十八)VFL语言初步 - 实现布局
  • (二)springcloud实战之config配置中心
  • (二)原生js案例之数码时钟计时
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (算法)求1到1亿间的质数或素数
  • (转)http协议
  • (转)我也是一只IT小小鸟
  • .net core + vue 搭建前后端分离的框架
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
  • .net 生成二级域名
  • .net 微服务 服务保护 自动重试 Polly
  • .Net 中Partitioner static与dynamic的性能对比
  • .NET企业级应用架构设计系列之技术选型
  • .NET正则基础之——正则委托
  • :中兴通讯为何成功
  • @开发者,一文搞懂什么是 C# 计时器!