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

【LeetCode】day15:110 - 平衡二叉树, 257 - 二叉树的所有路径, 404 - 左叶子之和, 222 - 完全二叉树的节点个数

LeetCode 代码随想录跟练 Day15

  • 110.平衡二叉树
  • 257.二叉树的所有路径
  • 404.左叶子之和
  • 222.完全二叉树的节点个数

110.平衡二叉树

题目描述:

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

平衡二叉树的定义是,对于树中的每个节点,其左右子树的高度差不超过1。思路使用递归,对比左子树和右子树的高度差是否超过1,若超过1则当前节点返回-1作为标示,否则返回当前节点的最大深度。代码如下:

class Solution {
private:int traverse(TreeNode* root) {if (root == nullptr) return 0;int leftHeight = traverse(root->left);int rightHeight = traverse(root->right);if (leftHeight == -1 || rightHeight == -1) {return -1;}if (leftHeight - rightHeight > 1 || leftHeight - rightHeight < -1) {return -1;}return max(leftHeight, rightHeight) + 1;}public:bool isBalanced(TreeNode* root) {int height = traverse(root);if (height == -1) return false;return true;}
};

257.二叉树的所有路径

题目描述:

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

主要思路为对树进行遍历并将遍历时的当前路径记录,并在到达叶子节点后将当前路径添加到结果中。同时在遍历过程中需要对路径的状态实时进行回溯,比如从当前节点退出,上一个节点的路径中就不应再保留当前节点的信息。这里使用字符串值传递方式,可以非显式的实现回溯。代码如下:

class Solution {
private:void traverse(TreeNode* root, string path, vector<string>& paths) {if (root == nullptr) return;if (!path.empty()) path += "->";path += to_string(root->val);if (!root->left && !root->right) {paths.push_back(path);return;}traverse(root->left, path, paths);traverse(root->right, path, paths);}public:vector<string> binaryTreePaths(TreeNode* root) {vector<string> res;if (root == nullptr) return res;traverse(root, "", res);return res;}
};

另外使用迭代法进行遍历时,原理相同,在push节点进入记录节点的stack时同时将当前路径同时push进入记录路径的stack中,这样在每次循环获取当前节点时获取到的路径是对应的。注意在分别对左右节点的路径修改时,由于存在需要在处理前一个之后继续处理后一个的情况(左右节点都不为nullptr),所以不能修改path变量而是应该通过临时变量记录路径并入栈。代码如下:

class Solution {
public:vector<string> binaryTreePaths(TreeNode* root) {vector<string> res;if (root == nullptr) return res;stack<TreeNode*> nodeStk;stack<string> pathStk;nodeStk.push(root);pathStk.push(to_string(root->val));while (!nodeStk.empty()) {TreeNode* cur = nodeStk.top(); nodeStk.pop();string path = pathStk.top(); pathStk.pop();if (!cur->left && !cur->right) {res.push_back(path);continue;}if (cur->left) {nodeStk.push(cur->left);pathStk.push(path + "->" + to_string(cur->left->val));}if (cur->right) {nodeStk.push(cur->right);pathStk.push(path + "->" + to_string(cur->right->val));}}return res;}
};

404.左叶子之和

题目描述:

给定二叉树的根节点 root ,返回所有左叶子之和。
示例 1:
在这里插入图片描述
输入: root = [3,9,20,null,null,15,7]
输出: 24
解释: 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24
示例 2:
输入: root = [1]
输出: 0

在遍历时使用isLeft的bool变量标示当前节点是否是上一个状态的左节点,在确认叶子节点值时同时需要确保该bool变量为true,其余均为遍历框架。代码如下:

class Solution {
private:int traverse(TreeNode* root, bool isLeft) {if (root == nullptr) return 0;if (!root->left && !root->right && isLeft) {return root->val;}int left = traverse(root->left, true);int right = traverse(root->right, false);return left + right;}public:int sumOfLeftLeaves(TreeNode* root) {return traverse(root, false);}
};

同理可以使用迭代法,通过确认左节点的方式:若左节点不为nullptr且为叶子节点,则记录结果,除此之外的所有都不算左叶子。代码如下:

class Solution {
public:int sumOfLeftLeaves(TreeNode* root) {if (root == nullptr) return 0;stack<TreeNode*> stk;stk.push(root);int res = 0;while (!stk.empty()) {TreeNode* cur = stk.top(); stk.pop();// 若左节点不为nullptr且为叶子节点if (cur->left && !cur->left->left && !cur->left->right) {res += cur->left->val;}if (cur->left) stk.push(cur->left);if (cur->right) stk.push(cur->right);}return res;}
};

222.完全二叉树的节点个数

题目描述:

给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。
完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1 1 1~ 2 h 2^h 2h 个节点。
示例 1:
在这里插入图片描述
输入:root = [1,2,3,4,5,6]
输出:6
示例 2:
输入:root = []
输出:0
示例 3:
输入:root = [1]
输出:1

最简单的二叉树遍历计算节点数,这里使用层序遍历实现:

class Solution {
public:int countNodes(TreeNode* root) {if (root == nullptr) return 0;queue<TreeNode*> q;int res = 0;q.push(root);while (!q.empty()) {int size = q.size();res += size;while (size--) {TreeNode* cur = q.front(); q.pop();if (cur->left) q.push(cur->left);if (cur->right) q.push(cur->right);}}return res;}
};

由于题中所给为完全二叉树,可以根据其特性进行优化:完全二叉树的高度可以通过一直向左直到叶子节点确定、完全二叉树的节点树可以通过比较左右子树的高度来判断。
若左子树高度等于右子树,根据完全二叉树的性质可知左子树为满二叉树(完全二叉树的叶子节点从最左边开始,右子树高度相同则表示左边排满了);若高度不同相反则表示左子树不满,而右子树一定是高度小一行的满二叉树。代码如下:

class Solution {
private:int getHeight(TreeNode* node) {int res = 0;while (node) {++res;node = node->left;}return res;}public:int countNodes(TreeNode* root) {if (root == nullptr) return 0;int leftHeight = getHeight(root->left);int rightHeight = getHeight(root->right);if (leftHeight == rightHeight) {return (1 << leftHeight) + countNodes(root->right);} else {return (1 << rightHeight) + countNodes(root->left);}}
};

相关文章:

【LeetCode】day15:110 - 平衡二叉树, 257 - 二叉树的所有路径, 404 - 左叶子之和, 222 - 完全二叉树的节点个数

LeetCode 代码随想录跟练 Day15 110.平衡二叉树257.二叉树的所有路径404.左叶子之和222.完全二叉树的节点个数 110.平衡二叉树 题目描述&#xff1a; 给定一个二叉树&#xff0c;判断它是否是 平衡二叉树 平衡二叉树的定义是&#xff0c;对于树中的每个节点&#xff0c;其左右…...

【网络安全的神秘世界】Error:Archives directory /var/cache/apt/archives/partial is missing.

&#x1f31d;博客主页&#xff1a;泥菩萨 &#x1f496;专栏&#xff1a;Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具 ✨问题描述 在kali中想要安装beef-xss软件包时&#xff0c;发生如下报错&#xff1a; Error: Archives directory /var/cac…...

网络编程中的TCP和UDP

什么是TCP协议 TCP( Transmission control protocol )即传输控制协议&#xff0c;是一种面向连接、可靠的数据传输协议&#xff0c;它是为了在不可靠的互联网上提供可靠的端到端字节流而专门设计的一个传输协议。 面向连接 &#xff1a;数据传输之前客户端和服务器端必须建立连…...

基于python的时空地理加权回归(GTWR)模型

一、时空地理加权回归&#xff08;GTWR&#xff09;模型 时空地理加权回归&#xff08;GTWR&#xff09;模型是由美国科罗拉多州立大学的Andy Liaw、Stanley A. Fiel和Michael E. Bock于2008年提出的一种高级空间统计分析方法。它是在传统地理加权回归&#xff08;GWR&#xf…...

什么是单例模式,有哪些应用?

目录 一、定义 二、应用场景 三、6种实现方式 1、懒汉式&#xff0c;线程不安全。 2、懒汉式&#xff0c;线程安全 3、双检锁/双重校验锁&#xff08;DCL&#xff0c;即 double-checked locking&#xff09; 4、静态内部类方式-------只适用于静态域 5、饿汉式 6、枚举…...

adb命令操作手机各种开关

打开iqoo手机热点设置 adb shell am start -n com.android.settings/com.android.settings.Settings$\VivoTetherSettingsActivity蓝牙模块 检查蓝牙状态的ADB命令 检查蓝牙开关状态 adb shell settings get global bluetooth_on开启和关闭蓝牙 使用Intent操作蓝牙&#xf…...

【分布式存储系统HDFS】架构和使用

分布式存储系统HDFS&#xff1a;架构和使用 目录 引言HDFS简介HDFS的架构 NameNodeDataNodeSecondary NameNode HDFS的工作原理 数据读写流程数据冗余与恢复 HDFS的安装和配置 环境准备HDFS安装步骤HDFS配置文件启动HDFS HDFS的使用 基本命令HDFS Shell操作Java API操作 HDFS…...

Linux 实验一Linux系统安装

一、实验日期与地址 1、实验日期&#xff1a;2024年 2 月28 日 2、实验地址&#xff1a;S1-504 二、实验目的 1、掌握VMware Workstation建立虚拟机 2、掌握虚拟机环境下安装Centos 7 三、实验环境 VMware Workstation、Centos 7 四、实验内容 1、安装VMware Workstat…...

【人工智能】深度剖析AI伦理:强化隐私防线,推动算法公平性的核心议题

文章目录 &#x1f34a;1 人工智能兴起背后的伦理及道德风险1.1 算法偏见与歧视1.2 数据隐私侵权1.3 透明度受限1.4 决策失衡1.5 AI生成内容的危险性 &#x1f34a;2 建构AIGC伦理观&#xff1a;实现人机共创的永续提升2.1 技术手段与伦理预防2.2 即时警告与紧急关停措施2.3 法…...

如何解决微服务下引起的 分布式事务问题

一、什么是分布式事务&#xff1f; 虽然叫分布式事务&#xff0c;但不是一定是分布式部署的服务之间才会产生分布式事务。不是在同一个服务或同一个数据库架构下&#xff0c;产生的事务&#xff0c;也就是分布式事务。 跨数据源的分布式事务 跨服务的分布式事务 二、解决方…...

牛客周赛50轮+cf955+abc363

D-小红的因式分解_牛客周赛 Round 50 (nowcoder.com) 思路&#xff1a; 巨蠢的题目&#xff0c;ax^2bxca1*a2*x^2(b1*a2b2*a1)xb1*b2&#xff0c;即&#xff1a; aa1*a2,ba1*b2a2*b1,cb1*b2 数据范围很小&#xff0c;直接暴力枚举吧&#xff08;注意条件&#xff09; 代码…...

【MySQL】:对库和表的基本操作方法

数据库使用的介绍 什么是SQL 学习数据库的使用——>基于 SQL编程语言 来对数据库进行操作 重点表述的是“需求”&#xff0c;期望得到什么结果。&#xff08;至于结果是如何得到的&#xff0c;并不关键&#xff0c;都是数据库服务器在背后做好了&#xff09; 重点表述的是…...

Library not found for -lstdc++.6.0.9

解决方案一 由于项目已经很多年了&#xff0c;前段时间更新了Xcode发现编译报错lstdc这个库很早以前就被舍弃了&#xff0c;但是一个项目的维护都随着解决bug堆砌出来的&#xff0c;这也导致了我们的项目走上了这条路。 比如 Library not found for -lstdc.6.0.9 报的错&#x…...

防火墙之双机热备篇

为什么要在防火墙上配置双机热备技术呢&#xff1f; 相信大家都知道&#xff0c;为了提高可靠性&#xff0c;避免单点故障 肯定有聪明的小伙伴会想到那为什么不直接多配置两台防火墙&#xff0c;然后再将他们进行线路冗余&#xff0c;不就完成备份了吗&#xff1f; 答案是不…...

终端里面ifconfig命令无法运行

在 Ubuntu 以及基于 Debian 的系统中&#xff0c;ifconfig 命令可能不会默认安装&#xff0c;因为自 Ubuntu 17.10 版本开始&#xff0c;系统默认使用 ip 命令作为网络配置的主要工具&#xff0c;而 ifconfig 命令则来自 net-tools 包&#xff0c;该包不再作为标准工具被包含在…...

掌握Python中的文件序列化:Json和Pickle模块解析

Python 文件操作与管理&#xff1a;Open函数、Json与Pickle、Os模块 在Python中&#xff0c;文件是一个重要的数据处理对象。无论是读取数据、保存数据还是进行数据处理&#xff0c;文件操作都是Python编程中不可或缺的一部分。本文将详细介绍Python中文件操作的几种常用方法&…...

WordPress 6.6 “Dorsey多尔西”发布

WordPress 6.6 “Dorsey多尔西”已经发布&#xff0c;它以传奇的美国大乐队领袖 Tommy Dorsey 名字命名。Dorsey 以其音调流畅的长号和作品而闻名&#xff0c;他的音乐以其情感深度和充满活力的能量吸引了观众。 当您探索 WordPress 6.6 的新功能和增强功能时&#xff0c;让您的…...

核函数支持向量机(Kernel SVM)

核函数支持向量机&#xff08;Kernel SVM&#xff09;是一种非常强大的分类器&#xff0c;能够在非线性数据集上实现良好的分类效果。以下是关于核函数支持向量机的详细数学模型理论知识推导、实施步骤与参数解读&#xff0c;以及两个多维数据实例&#xff08;一个未优化模型&a…...

二分查找(折半查找)

这次不排序了&#xff0c;对排好序的数组做个查找吧 介绍 二分查找排序英文名为BinarySort&#xff0c;是一种效率较高的查找方法要求线性表必须采用顺序存储结构 基本思路 通过不断地将搜索范围缩小一半来找到目标元素&#xff1a; 1、假定数组为arr&#xff0c;需要查找的…...

arcgis紧凑型切片缓存(解决大范围切片,文件数量大的问题)

ArcGIS 切片缓存的紧凑型存储格式是一种优化的存储方式&#xff0c;用于提高切片缓存的存储效率和访问速度。紧凑型存储格式将多个切片文件合并为一个单一的 .bundle 文件&#xff0c;从而减少文件系统的开销和切片的加载时间。这类格式已经应用很久了&#xff0c;我记得2013我…...

ESP32CAM人工智能教学15

ESP32CAM人工智能教学15 Flask服务器TCP连接 小智利用Flask在计算机中创建一个虚拟的网页服务器服务器&#xff0c;让ESP32Cam通过WiFi连接&#xff0c;把摄像头拍摄到的图片发送到电脑中&#xff0c;并在电脑中保存成图片文件。 Flask是用Python编写的网页服务程序WebServer。…...

Pandas 33个冷知识 0721

Pandas 33个冷知识 从Excel读取数据: 使用 pd.read_excel(file.xlsx) 来读取Excel文件。 写入Excel: 使用 df.to_excel(file.xlsx, indexFalse) 将DataFrame写入Excel文件。 创建日期索引: 使用 df.set_index(pd.to_datetime(df[date])) 创建日期索引。 向后填充缺失值: 使用…...

C++ map和set的使用

目录 0.前言 1.关联式容器 2.键值对 3.树形结构的关联式容器 3.1树形结构的特点 3.2树形结构在关联式容器中的应用 4.set 4.1概念与性质 4.2使用 5.multiset 5.1概念与性质 5.2使用 6.map 6.1概念与性质 6.2使用 7.multimap 7.1概念与性质 7.2使用 8.小结 &a…...

yarn的安装和配置以及更新总结,npm的对照使用差异

1. Yarn简介 Yarn 是一个由 Facebook 开发的现代 JavaScript 包管理器&#xff0c;旨在提供更快、更安全、更可靠的包管理体验。 1.1 什么是Yarn Yarn 是一个快速、可靠和安全的 JavaScript 包管理器&#xff0c;它通过并行化操作和智能缓存机制&#xff0c;显著提升了依赖安…...

【Git命令】git rebase之合并提交记录

使用场景 在本地提交了两个commit&#xff0c;但是发现根本没有没必要分为两次&#xff0c;需要想办法把两次提交合并成一个提交&#xff1b;这个时候可以使用如下命令启动交互式变基会话&#xff1a; git rebase -i HEAD~N这里 N 是你想要重新调整的最近的提交数。 如下在本地…...

为什么品牌需要做 IP 形象?

品牌做IP形象的原因有多方面&#xff0c;这些原因共同构成了IP形象在品牌建设中的重要性和价值&#xff0c;主要原因有以下几个方面&#xff1a; 增强品牌识别度与记忆点&#xff1a; IP形象作为品牌的视觉符号&#xff0c;具有独特性和辨识性&#xff0c;能够在消费者心中留…...

Kubernetes 1.24 版弃用 Dockershim 后如何迁移到 containerd 和 CRI-O

在本系列的上一篇文章中&#xff0c;我们讨论了什么是 CRI 和 OCI&#xff0c;Docker、containerd、CRI-O 之间的区别以及它们的架构等。最近&#xff0c;我们得知 Docker 即将从 kubernetes 中弃用&#xff01;&#xff08;查看 kubernetes 官方的这篇文章&#xff09;那么让我…...

70. 爬楼梯【 力扣(LeetCode) 】

一、题目描述 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 二、测试用例 示例 1&#xff1a; 输入&#xff1a;n 2 输出&#xff1a;2 解释&#xff1a;有两种方法可以爬到楼顶。 1. 1 阶…...

R语言优雅的把数据基线表(表一)导出到word

基线表&#xff08;Baseline Table&#xff09;是医学研究中常用的一种数据表格&#xff0c;用于在研究开始时呈现参与者的初始特征和状态。这些特征通常包括人口统计学数据、健康状况和疾病史、临床指标、实验室检测、生活方式、社会经济等。 本人在既往文章《scitb包1.6版本发…...

XMl基本操作

引言 使⽤Mybatis的注解⽅式&#xff0c;主要是来完成⼀些简单的增删改查功能. 如果需要实现复杂的SQL功能&#xff0c;建议使⽤XML来配置映射语句&#xff0c;也就是将SQL语句写在XML配置⽂件中. 之前&#xff0c;我们学习了&#xff0c;用注解的方式来实现MyBatis 接下来我们…...

网站域名登录/百度网首页官网

Form.errors 访问errors属性以获取错误消息的字典&#xff1a; >>> f.errors >{sender&#xff1a;[输入有效的电子邮件地址。]&#xff0c;subject&#xff1a;[此字段为必填项.]。 在这个字典中&#xff0c;键是字段名称&#xff0c;值是表示错误消息的Unicod…...

wordpress css https/推广软件赚钱

[原创] debian 9.3 搭建JiraConfluenceBitbucket项目管理工具(四) -- 安装crowd 3.1.2 本来已经安装完毕, 并使用Jira集成的OAuth账户管理, 但是不知道什么原因, 在confluence里始终无法通过认证, 即:按照提示认证后, 页面一闪, 然后还是老样子, 但是bitbucket确好使. 好来就像…...

高级经济师/seo推广知识

Daniel2cscanf我不知道为什么,当我运行它时,它会跳过"书中有多少页" scanf并直接进入第二个循环"谁是作者".我确定这与空白有关,但我认为我用getcharfor循环的底部来解释这个问题.标题:struct bookInfo{char title[40];char author[25];float price;int pa…...

网站页面优化方法有哪些/引流推广的句子

题目 给你两个整数数组 source 和 target &#xff0c;长度都是 n 。还有一个数组 allowedSwaps &#xff0c;其中每个 allowedSwaps[i] [ai, bi] 表示你可以交换数组 source 中下标为 ai 和 bi&#xff08;下标从 0 开始&#xff09;的两个元素。注意&#xff0c;你可以按 任…...

热门的网页设计工具有哪些/厦门百度快照优化排名

废话不多说&#xff0c;直接开始&#xff0c;整体规划如下&#xff1a; 实验通过虚拟机实现&#xff0c;基于Red Hat 5.8来完成 1.资源分析 在做实验之前&#xff0c;首先要知道高可用用于分配的资源有哪些&#xff0c;由于我们做的是Lvs DR模型Director的高可用&#xff0c;用…...

商务网站模块设计时前台基础设施建设/百度应用商店app

1007. 素数对猜想 (20) 时间限制400 ms内存限制32000 kB代码长度限制8000 B判题程序Standard作者CHEN, Yue让我们定义 dn 为&#xff1a;dn pn1 - pn&#xff0c;其中 pi 是第i个素数。显然有 d11 且对于n>1有 dn 是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素…...