在这里插入图片描述

LeetCode题目链接
https://leetcode.cn/problems/balanced-binary-tree/
https://leetcode.cn/problems/binary-tree-paths/
https://leetcode.cn/problems/sum-of-left-leaves/
https://leetcode.cn/problems/count-complete-tree-nodes/

题解
110.平衡二叉树
在这里插入图片描述
在这里插入图片描述

想到用左子树的高度减右子树的高度,但递归不知道怎么求高度。在求高度的函数里,高度depth放在条件里还是在函数体里重新定义一个变量。用层序遍历求高度行不行?不用递归?
看了题解,首先明确递归终止条件,遇到空结点时高度为0。接着递归得到左右子树的高度,并确定一个规则,就是当遇到的树不是平衡树时,返回-1。但对高度判断的条件又怎么写呢?直接判断是否等于-1。在后面计算result值时,要把当前结点的高度也加上,左右子树的高度的最大值。
通过结点传回的高度为0确定整棵树的高度基点,然后往上返回时都能令符合平衡二叉树结点的”根“结点高度值加1,当某个结点不满足平衡二叉树的要求时,它以及它上面的所有结点高度值都将为-1。-1是个标记,标记本树中出现了不符合平衡二叉树的子树。

257.二叉树的所有路径
知道用回溯的方法写这道题,但不知道怎么放每次的递归条件。答案是当前的路径(因为要回溯)和结果数组(题目要求string)。
自己顺着思路写了一遍代码,小case过了,最后也过了。

404.左叶子之和
想到用递归去做,但是每次判断左叶子的条件不知道怎么定,还有一个思路是对每个左结点打标记,但怎么区分左叶子结点和左普通结点。
于是看题解,从左叶子结点的父结点去判断该结点是否是左叶子结点,这个思路其实我想到了,但一开始觉得麻烦,就没定下来。递归边界要确定,返回的是左叶子结点的值。后续的递归分支写法和110.平衡二叉树很像,但要注意求了赋值了两次同一个值,原因是左子树的值如果求出来了,而左叶子结点如果递归了返回的是0,这时需要在当前判断求左叶子结点的值,并重新赋值覆盖前面的。
有一个录友说,第一个是递归过程,第二个是真的在求叶子结点的值。

222.完全二叉树的节点个数
这一题是我唯一会的一题,用迭代法,任何一种遍历顺序都可以,但用递归法。写成了求叶子结点个数的代码,改了一下要加上当前结点的个数。看了一下题解,跟我写的也差不多。

代码

//110.平衡二叉树
#include <iostream>
using namespace std;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) {int depth = getHeight(root);if (depth == -1) return false;else return true;}int getHeight(TreeNode* root) {if (root == NULL) return 0;int leftHeight = getHeight(root->left);int rightHeight = getHeight(root->right);if (leftHeight == -1) return -1;if (rightHeight == -1) return -1;if (abs(leftHeight - rightHeight) > 1)return -1;else return 1 + max(leftHeight, rightHeight);}
};int main() {int nums1[30] = { 3,9,20,NULL,NULL,15,7 }, nums2[30] = { 1,2,2,3,3,NULL,NULL,4,4 };TreeNode* root1 = new TreeNode(3);root1->left = new TreeNode(9);root1->right = new TreeNode(20);root1->right->left = new TreeNode(15);root1->right->right = new TreeNode(7);TreeNode* root2 = new TreeNode(1);root2->left = new TreeNode(2);root2->right = new TreeNode(2);root2->left->left = new TreeNode(3);root2->left->right = new TreeNode(3);root2->left->left->left = new TreeNode(4);root2->left->left->right = new TreeNode(4);Solution s;printf("%d", s.isBalanced(root2));return 0;
}
//257.二叉树的所有路径
#include <iostream>
#include <vector>
#include <string>
using namespace std;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> binaryTreePaths(TreeNode* root) {vector<string> result;vector<int> path;if (root == NULL) return result;path.push_back(root->val);travelsal(root, path, result);return result;}void travelsal(TreeNode* cur, vector<int> &path, vector<string> &result) {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);}if (cur->left) {path.push_back(cur->left->val);travelsal(cur->left, path, result);path.pop_back();}if (cur->right) {path.push_back(cur->right->val);travelsal(cur->right, path, result);path.pop_back();}}
};int main() {int nums1[30] = { 1,2,3,NULL,5 }, nums2[30] = { 1 };TreeNode* root1 = new TreeNode(1);root1->left = new TreeNode(2);root1->right = new TreeNode(3);root1->left->right = new TreeNode(5);TreeNode* root2 = new TreeNode(1);Solution s;vector<string> result = s.binaryTreePaths(root2);for (int i = 0;i < result.size();i++) {cout << result[i] << " " << endl;}return 0;
}
//404.左叶子之和
#include <iostream>
using namespace std;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) {if (root == NULL) return 0;if (root->left == NULL && root->right == NULL) return 0;int leftValue = sumOfLeftLeaves(root->left);if (root->left != NULL && root->left->left == NULL && root->left->right == NULL) {leftValue = root->left->val;}int rightValue = sumOfLeftLeaves(root->right);return leftValue + rightValue;}
};int main() {int nums1[30] = { 3,9,20,NULL,NULL,15,7 }, nums2[30] = { 1 };TreeNode* root1 = new TreeNode(3);root1->left = new TreeNode(9);root1->right = new TreeNode(20);root1->right->left = new TreeNode(15);root1->right->right = new TreeNode(7);TreeNode* root2 = new TreeNode(1);Solution s;printf("%d", s.sumOfLeftLeaves(root2));return 0;
}
//222.完全二叉树的节点个数
#include <iostream>
using namespace std;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 countNodes(TreeNode* root) {if (root == NULL) return 0;if (root->left == NULL && root->right == NULL) return 1;int leftNum = countNodes(root->left);int rightNum = countNodes(root->right);return leftNum + rightNum + 1;}
};int main() {int nums1[30] = { 1,2,3,4,5,6 }, nums2[30] = {}, nums3[30] = {1};TreeNode* root1 = new TreeNode(1);root1->left = new TreeNode(2);root1->right = new TreeNode(3);root1->left->left = new TreeNode(4);root1->left->right = new TreeNode(5);root1->right->left = new TreeNode(6);TreeNode* root2 = nullptr;TreeNode* root3 = new TreeNode(1);Solution s;printf("%d", s.countNodes(root3));return 0;
}

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

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

相关文章

JVM新生代/老年代垃圾回收器、内存分配与回收策略

新生代垃圾收集器 1. Serial收集器 serial收集器即串行收集器&#xff0c;是一个单线程收集器。 串行收集器在进行垃圾回收时只使用一个CPU或一条收集线程去完成垃圾回收工作&#xff0c;并且会暂停其他的工作线程&#xff08;stop the world&#xff09;&#xff0c;直至回收完…

Unity Mirror 多人同步 基础教程

Unity Mirror 多人同步 基础教程MirrorNetworkManager&#xff08;网络管理器&#xff09;Configuration&#xff1a;配置Auto-Start Options&#xff1a;自动启动Scene Management&#xff1a;场景管理Network Info&#xff1a;网络信息Authentication&#xff1a;身份验证Pla…

基于红尾鹰优化的LSTM深度学习网络模型(RTH-LSTM)的一维时间序列预测算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.部分程序 4.算法理论概述 5.完整程序 1.程序功能描述 红尾鹰优化的LSTM&#xff08;RTH-LSTM&#xff09;算法&#xff0c;是将红尾鹰优化算法&#xff08;Red-Tailed Hawk Optimization, RTHO&#xff09;与长短期…

深度学习“调参”黑话手册:学习率、Batch Size、Epoch都是啥?

点击 “AladdinEdu&#xff0c;同学们用得起的【H卡】算力平台”&#xff0c;注册即送-H卡级别算力&#xff0c;80G大显存&#xff0c;按量计费&#xff0c;灵活弹性&#xff0c;顶级配置&#xff0c;学生更享专属优惠。 引言&#xff1a;从"炼丹"到科学&#xff0c;…

【网络实验】-MUX-VLAN

实验拓扑实验要求&#xff1a; 在企业网络中&#xff0c;企业员工和企业客户可以访问企业的服务器&#xff0c;对于企业来说&#xff0c;希望员工之间可以互相交流&#xff0c;但是企业用户之间相互隔离&#xff0c;不能够访问。为了实现所有用户都可以访问企业服务器&#xff…

Java泛型:类型安全的艺术与实践指南

Java泛型&#xff1a;类型安全的艺术与实践指南 前言&#xff1a;一个常见的编译错误 最近在开发中遇到了这样一个编译错误&#xff1a; Required type: Callable<Object> Provided: SalesPitchTask这个看似简单的错误背后&#xff0c;隐藏着Java泛型设计的深层哲学。今天…

UMI企业智脑 2.1.0:智能营销新引擎,图文矩阵引领内容创作新潮流

在数字营销日益激烈的今天&#xff0c;企业如何在信息洪流中脱颖而出&#xff1f;UMI企业智脑 2.1.0 的发布为企业提供了全新的解决方案。这款智能营销工具结合了先进的AI技术与数据驱动策略&#xff0c;帮助企业优化营销流程、提升效率&#xff0c;并通过图文矩阵实现内容创作…

Lustre Ceph GlusterFS NAS 需要挂载在k8s容器上,数据量少,选择哪一个存储较好

在 K8s 容器环境中&#xff0c;数据量 不大的 规模下&#xff0c;Lustre、Ceph、GlusterFS 和 NAS 的选择需结合性能需求、运维成本、扩展性和K8s 适配性综合判断。以下是针对性分析及推荐&#xff1a;一、核心对比与适用场景二、关键决策因素1. 性能需求高并发 / 高吞吐&#…

深入解析 Apache Doris 写入原理:一条数据的“落地之旅”

在日常的数据分析场景中&#xff0c;我们经常会向 Apache Doris 写入大量数据&#xff0c;无论是实时导入、批量导入&#xff0c;还是通过流式写入。但你是否想过&#xff1a;一条数据从客户端发出&#xff0c;到最终稳定落盘&#xff0c;中间到底经历了哪些步骤&#xff1f; …

基于MATLAB的视频动态目标跟踪检测实现方案

一、系统架构设计 视频动态目标跟踪系统包含以下核心模块&#xff1a; 视频输入模块&#xff1a;支持摄像头实时采集或视频文件读取预处理模块&#xff1a;灰度转换、降噪、光照补偿目标检测模块&#xff1a;背景建模、运动区域提取跟踪算法模块&#xff1a;卡尔曼滤波、粒子滤…

【Python】Python文件操作

Python文件操作 文章目录Python文件操作[toc]1.文件的编码2.文件打开、读取&#xff08;r模式&#xff09;、关闭3.文件的写入&#xff08;w模式&#xff09;4.文件的追加写入&#xff08;a模式&#xff09;5.综合案例1.文件的编码 意义&#xff1a;计算机只能识别0和1&#x…

CES Asia的“五年计划”:打造与北美展比肩的科技影响力

在全球科技产业版图中&#xff0c;展会一直是前沿技术展示、行业趋势探讨以及商业合作达成的关键平台。CES Asia&#xff08;亚洲消费电子技术展&#xff09;作为亚洲科技领域的重要展会&#xff0c;近日明确提出其“五年计划”&#xff0c;目标是打造与北美展会比肩的科技影响…

【计算机网络 | 第16篇】DNS域名工作原理

文章目录3.5 域名系统工作原理主机的标识方式&#xff1a;域名 vs IP 地址标识转换机制&#xff1a;DNS系统因特网的域名系统&#xff1a;层次域名空间&#x1f426;‍&#x1f525;顶级域名分类低级域名与管理域名与IP的区别因特网的域名系统&#xff1a;域名服务器&#x1f9…

YASKAWA安川机器人铝材焊接节气之道

在铝材焊接领域&#xff0c;保护气体的合理使用对焊接质量与成本控制至关重要。安川焊接机器人凭借高精度与稳定性成为行业常用设备&#xff0c;而WGFACS节气装置的应用&#xff0c;则为其在铝材焊接过程中实现高效节气提供了创新路径。掌握二者结合的节气之道&#xff0c;对提…

GooseDB,一款实现服务器客户端模式的DuckDB

在网上看到韩国公司开发的一款GooseDB&#xff0c; 官方网站对它的介绍是DuckDB™ 的功能扩展分支&#xff0c;具有服务器/客户端、多会话和并发写入支持&#xff0c;使用 PostgreSQL 有线协议&#xff08;DuckDB™是 DuckDB 基金会的商标&#xff09; 使用也很简单&#xff…

lesson62:JavaScript对象进化:ES2025新特性深度解析与实战指南

目录 一、迭代器辅助方法&#xff1a;对象数据处理的优雅革命 1.1 核心方法与语法 1.2 对象属性处理实战 1.3 性能与兼容性考量 二、JSON模块原生支持&#xff1a;对象加载的范式转变 2.1 静态与动态导入语法 2.2 与传统方案的对比优势 2.3 典型应用场景 三、Set集合增…

设计模式学习笔记(一)

设计模式学习笔记&#xff08;一&#xff09; 一般说设计模式都是指面向对象的设计模式&#xff0c;因为面向对象语言可以借助封装、继承、多态等特性更好的达到复用性、可拓展性、可维护性。 面向对象一般指以类、对象为组织代码的基本单元&#xff0c;并将封装、继承、多态、…

【CSS】一个自适应大小的父元素,如何让子元素的宽高比一直是2:1

父元素是自适应大小的容器&#xff08;比如 width:100%&#xff09;&#xff0c;我们希望子元素 始终保持 2:1 宽高比&#xff08;比如宽 200px → 高 100px&#xff0c;宽 300px → 高 150px&#xff09;。 有几种常见解法&#xff1a;✅ 方法一&#xff1a;CSS aspect-ratio&…

如何搭建redis集群(docker方式非哨兵)

1、redis的配置文件这里要注意&#xff0c;主从的ip不需要我们去设置&#xff0c;只需要设置主从的密码就可以&#xff0c;然后就是protect-mode&#xff0c;我设置的是no&#xff0c;一定注意不能设置主从。客户端要访问&#xff0c;一定要加# 每个节点的 redis.conf 中 clust…

如何学习VBA_3.3.9:利用“搭积木”思想,快速有效地完成你的代码

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的劳动效率&#xff0c;而且可以提高数据处理的准确度。我推出的VBA系列教程共九套和一部VBA汉英手册&#xff0c;现在已经全部完成&#xff0c;希望大家利用、学习。如果您…