力扣做题记录 (二叉树)
二叉树
打算先来了解二叉树基础,都是简单题,目的是熟悉代码格式和解题基础思路。
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 maxDepth(TreeNode* root) {if(root ==nullptr)return 0;return max(maxDepth(root->left), maxDepth(root->right))+1;}
};
方法二、广度搜索
- 利用queue来存储每一层的节点
- 每层次循环是当前queue的长度,用一个数来记录,一般是2的次方,然后再将新的数放置queue末尾。
class Solution {
public:int maxDepth(TreeNode* root) {if(root==nullptr)return 0;queue<TreeNode*> Q;Q.push(root);int depth = 0;while(!Q.empty()){int sz=Q.size();while(sz>0){TreeNode* node= Q.front();Q.pop();if(node->left)Q.push(node->left);if(node->right)Q.push(node->right);sz-=1;}depth+=1;}return depth;}
};
2、相同的树
相同的树

方法一、前序遍历比较
这是自己写的,思路是确定可以用递归,这个是深度搜索
然后先判断节点存在,再判断是否正确
/*** 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 isSameTree(TreeNode* p, TreeNode* q) {bool a=true,b=true;if(p==nullptr&&q==nullptr)return true;else if(p!=nullptr&&q==nullptr)return false;else if(p==nullptr&&q!=nullptr)return false;else{if(p->val!=q->val)return false;a=isSameTree(p->left,q->left);b=isSameTree(p->right,q->right);}if(a==false||b==false)return false;else return true;}
};
方法二、广度搜索
来自官方题解中的一种有点复杂。
class Solution {
public: // 检查两棵二叉树是否相同 bool isSameTree(TreeNode* p, TreeNode* q) { // 如果两棵树都为空,返回 true if (p == nullptr && q == nullptr) { return true; } // 如果一棵树为空而另一棵树不为空,返回 false else if (p == nullptr || q == nullptr) { return false; } // 创建两个队列用于广度优先搜索(BFS) queue<TreeNode*> queue1, queue2; queue1.push(p); // 将第一个树的根节点入队 queue2.push(q); // 将第二个树的根节点入队 // 当两个队列都不为空时,继续比较 while (!queue1.empty() && !queue2.empty()) { // 取出两个队列的前端节点进行比较 auto node1 = queue1.front(); queue1.pop(); auto node2 = queue2.front(); queue2.pop(); // 比较两个节点的值 if (node1->val != node2->val) { return false; // 值不相同,则树不相同 } // 获取当前节点的左右子节点 auto left1 = node1->left, right1 = node1->right; auto left2 = node2->left, right2 = node2->right; // 检查左右子节点是否存在不一致 if ((left1 == nullptr) ^ (left2 == nullptr)) { return false; // 只有一棵树有左子节点 } if ((right1 == nullptr) ^ (right2 == nullptr)) { return false; // 只有一棵树有右子节点 } // 如果左右子节点存在,则将其加入队列中 if (left1 != nullptr) { queue1.push(left1); // 将第一个树的左子节点添加到队列 } if (right1 != nullptr) { queue1.push(right1); // 将第一个树的右子节点添加到队列 } if (left2 != nullptr) { queue2.push(left2); // 将第二个树的左子节点添加到队列 } if (right2 != nullptr) { queue2.push(right2); // 将第二个树的右子节点添加到队列 } } // 返回两个队列是否都为空(即两棵树的结构是否相同) return queue1.empty() && queue2.empty(); }
};
3、翻转二叉树
翻转二叉树

方法一、
用递归找到最下方的左右子树,直接更换节点而不是值
/*** 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:TreeNode* invertTree(TreeNode* root) {if(root==nullptr){return nullptr;}TreeNode *left=invertTree(root->left);TreeNode *right=invertTree(root->right);root->left=right;root->right=left;return root;}
};
4、对称二叉树
101.对称二叉树

方法一、广度匹配
也就是迭代求解,下面是我自己写的复杂的代码,因为本能觉得可以把每一层,存储为一个vector,然后再综合比较。但是实现起来略显复杂
/*** 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 isSymmetric(TreeNode* root) {queue<TreeNode*> tree_level;vector<int> num_level;vector<int> num_level_re;int level=1;if(root->left==nullptr&&root->right==nullptr)return true;else if(root->left!=nullptr&&root->right!=nullptr){level=1;}else return false;tree_level.push(root->left);num_level.push_back(root->left->val);tree_level.push(root->right);num_level.push_back(root->right->val);while(tree_level.size()!=0){num_level_re=num_level;reverse(num_level_re.begin(),num_level_re.end());for(int i=0;i<num_level.size();i++){if(num_level[i]==num_level_re[i])continue;else return false;}num_level.clear();num_level_re.clear();// 把每层都节点和元素加入int level1 = tree_level.size();while(level1>0){TreeNode* root_now;root_now = tree_level.front();tree_level.pop();if(root_now->left!=nullptr){tree_level.push(root_now->left);num_level.push_back(root_now->left->val);}else num_level.push_back(-1);if(root_now->right!=nullptr){tree_level.push(root_now->right);num_level.push_back(root_now->right->val);}else num_level.push_back(-1);level1--;}// 判断每层不能为奇数if(tree_level.size()%2!=0)return false; level++;}return true;}
};
方法二、精简迭代法
其思路是:特地写一个辅助函数,可以同时输入左右子树,这样更加方便做迭代
class Solution {
public:bool check(TreeNode *u, TreeNode *v) {queue <TreeNode*> q;q.push(u); q.push(v);while (!q.empty()) {u = q.front(); q.pop();v = q.front(); q.pop();if (!u && !v) continue;if ((!u || !v) || (u->val != v->val)) return false;q.push(u->left); q.push(v->right);q.push(u->right); q.push(v->left);}return true;}bool isSymmetric(TreeNode* root) {return check(root, root);}
};
方法三、递归法
比较难想到,下面是解释
也需要辅助函数, 然后最左的和最右的分别组成对对比
class Solution {
public:// 辅助函数:检查两个子树是否对称bool check(TreeNode *leftNode, TreeNode *rightNode) {// 情况 1:两个节点都为空if (leftNode == nullptr && rightNode == nullptr) {return true; // 空节点是对称的}// 情况 2:其中一个节点为空,另一个不为空if (leftNode == nullptr || rightNode == nullptr) {return false; // 不对称}// 情况 3:两个节点的值不相等if (leftNode->val != rightNode->val) {return false; // 不对称}// 递归检查:// 1. 左子树的左节点和右子树的右节点是否对称// 2. 左子树的右节点和右子树的左节点是否对称bool isOuterSymetric = check(leftNode->left, rightNode->right); // 检查外层bool isInnerSymetric = check(leftNode->right, rightNode->left); // 检查内层// 只有外层和内层都对称,整个树才对称return isOuterSymetric && isInnerSymetric;}// 主函数:判断二叉树是否对称bool isSymmetric(TreeNode* root) {// 如果根节点为空,直接返回 true(空树是对称的)if (root == nullptr) {return true;}// 检查左子树和右子树是否对称return check(root->left, root->right);}
};
相关文章:
力扣做题记录 (二叉树)
二叉树 打算先来了解二叉树基础,都是简单题,目的是熟悉代码格式和解题基础思路。 1、二叉树最大深度 二叉树最大深度 方法一、深度搜索 直接用原函数做递归,比较简单 /*** Definition for a binary tree node.* struct TreeNode {* …...
机试刷题_字符串的排列【python】
题目:字符串的排列 from os import dup # # 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 # # # param str string字符串 # return string字符串一维数组 # class Solution:def backtrack(self,res,state,choi…...
百度智能云—千帆 ModelBuilder API的简单调用(Java)
百度简介 百度(Baidu)是拥有强大互联网基础的领先AI公司。百度愿景是:成为最懂用户,并能帮助人们成长的全球顶级高科技公司。 “百度”二字,来自于八百年前南宋词人辛弃疾的一句词:众里寻他千百度。这句话…...
unity学习43:子状态机 sub-state machine
目录 1sub-state machine子状态机 1.1 创建 sub-state machine 1.2 sub-state machine 内容 1.3 子状态机的应用 2 子状态机不同于blend tree的嵌套 3 应用例子:若角色拿不同武器的动画设计,可以使用2种方法 3.1 在1个图层layer里,使用…...
Qt MainWindow
文章目录 0. 概述1. 菜单栏 QMenuBar1.1 例子1,使用图形化界面1.2 例子2,使用代码创建1.3 例子3,添加快捷键1.4 例子4,添加子菜单1.5 例子5,添加分割线和图标1.6 内存泄漏问题 2. 工具栏 QToolBar2.1 例子1,…...
GDB QUICK REFERENCE (GDB 快速参考手册)
GDB QUICK REFERENCE {GDB 快速参考手册} References GDB QUICK REFERENCE GDB Version 4 https://users.ece.utexas.edu/~adnan/gdb-refcard.pdf 查看方式:在新标签页中打开图片 References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/ [2] gdb-refc…...
【数据结构】 栈和队列
在计算机科学的世界里,数据结构是构建高效算法的基础。栈(Stack)和队列(Queue)作为两种基本且重要的数据结构,在软件开发、算法设计等众多领域都有着广泛的应用。今天,我们就来深入探讨一下栈和…...
AI视频创作教程:如何用AI让古画动起来。
事情缘由: 如果是简单的图,找原图直接写提示词即可。 如果碰到多人多活动的图,直接出的效果会很不好,那么该怎么做呢? 图片分模块 首先,复杂部分的图,把长图分多个模块。 比如这张图࿰…...
撕碎QT面具(1):Tab Widget转到某个Tab页
笔者未系统学过C语法,仅有Java基础,具体写法仿照于大模型以及其它博客。自我感觉,如果会一门对象语言,没必要先刻意学C,因为自己具有对象语言的基础,等需要用什么再学也不迟。毕竟不是专门学C去搞算法。 1…...
DeepSeek24小时写作机器人,持续创作高质量文案
内容创作已成为企业、自媒体和创作者的核心竞争力。面对海量的内容需求,人工创作效率低、成本高、质量参差不齐等问题日益凸显。如何在有限时间内产出高质量内容?DeepSeek写作机器人,一款24小时持续创作的智能工具,为企业和个人提…...
npm安装依赖(npm install)时遇到认证错误的解决方案
问题描述 在使用 npm install 安装依赖时遇到以下错误: npm error code E401 npm error Incorrect or missing password.解决方案 方案一:使用淘宝(或其它国内公共)镜像(如果已经是淘宝镜像跳过此步) 设…...
SpringBoot+微信小程序+数据可视化的宠物到家喂宠服务(程序+论文+讲解+安装+调试+售后等)
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,我会一一回复,希望帮助更多的人。 系统介绍 在经济高速发展、物质生活极大丰富的当下,人们的精神需求愈发凸显࿰…...
免费大模型网站
腾讯元宝 腾讯元宝 秘塔搜索 秘塔搜索 超算互联网 超算互联网回答速度很慢 Chatbot Arena Chatbot Arena 大模型竞技场。...
OpenCV的主要模块
OpenCV的模块...
使用 Python 爬虫和 FFmpeg 爬取 B 站高清视频
以下是一个完整的 Python 爬虫代码示例,用于爬取 B 站视频并使用 FFmpeg 合成高清视频。 1. 准备工作 确保安装了以下 Python 库和工具: bash复制 pip install requests moviepy2. 爬取视频和音频文件 B 站的视频和音频文件通常是分开存储的&#x…...
Retrieval-Augmented Generation for LargeLanguage Models: A Survey
标题:Retrieval-Augmented Generation for Large Language Models: A Survey 作者:Yunfan Gaoa , Yun Xiongb , Xinyu Gaob , Kangxiang Jiab , Jinliu Panb , Yuxi Bic , Yi Daia , Jiawei Suna , Meng Wangc , and Haofen Wang 1. By referencing ext…...
2025年2月16日(numpy-deepseek)
嗯,用户让我介绍一下这段使用numpy的代码。首先,我需要确认用户的需求是什么。他们可能刚开始学习Python或者数据科学,所以需要基础的解释。让我仔细看一下代码。 第一行是import numpy as np,这应该是导入numpy库,并…...
C#windows窗体人脸识别
一、创建一个数据库,名为TestFaceDB 里面有一张表就OK了,表名Users,表里面有几个字段我说明一下: id--------------------bigint----------------------编号 name--------------varchar(50)-----------------用户名 phone--------------v…...
【第11章:生成式AI与创意应用—11.1 文本生成与创意写作辅助的实现与优化】
凌晨三点的书房,作家李明第27次删除了刚写好的段落。窗外路灯在稿纸上投下斑驳光影,就像他此刻支离破碎的创作灵感。突然,写作软件弹出提示:"检测到情感转折生硬,建议尝试’雨夜独白’场景模板?"这个由生成式AI驱动的建议,不仅拯救了濒临崩溃的章节,更揭开了…...
【Elasticsearch】通过运行时字段在查询阶段动态覆盖索引字段
在 Elasticsearch 中,Override field values at query time是指通过运行时字段(runtime fields)在查询阶段动态覆盖索引字段的值,而无需修改原始索引数据。这种功能特别适用于以下场景: 1. 动态修改字段值:…...
SITS2026变革落地五步法:AISMM框架驱动下,如何用90天重构IT服务治理体系?
更多请点击: https://intelliparadigm.com 第一章:SITS2026变革落地五步法:AISMM框架驱动下,如何用90天重构IT服务治理体系? SITS2026作为新一代IT服务治理标准,其核心在于将AI原生能力深度嵌入服务成熟度…...
KS-Downloader:快手无水印视频下载的终极解决方案
KS-Downloader:快手无水印视频下载的终极解决方案 【免费下载链接】KS-Downloader 快手(KuaiShou)视频/图片下载工具;数据采集工具 项目地址: https://gitcode.com/gh_mirrors/ks/KS-Downloader 还在为下载快手视频时出现的…...
【软考高级架构】案例题考前突击13:SAAM / ATAM / CBAM
一、SAAM 架构情景分析法 1. 场景开发:与系统相关风险承担者共同协商,开发一组任务场景。 2. 架构描述:对系统架构进行正式描述,包含计算构件、数据构件及构件间交互关系。 3. 单个场景评估:逐一评估每个场景,判断架构对直接场景、间接场景的支持程度。 4. 场景交互:…...
NLP情感分析:从传统方法到深度学习
NLP情感分析:从传统方法到深度学习 1. 技术分析 1.1 情感分析任务 类型描述典型应用二分类积极/消极评论分析三分类积极/中性/消极舆情监测多标签多种情感混合复杂文本 1.2 方法对比 方法特点性能词典方法基于情感词典中等传统MLTF-IDFSVM良好深度学习Word2VecCNN/R…...
AI工具搭建自动化视频生成LoCon
# AI工具搭建自动化视频生成LoCon:一个深度实践者的视角 什么是LoCon LoCon这个词,第一次听到的人可能会觉得是某个新款的智能硬件。其实它是“LoRA Control”的缩写,专指在视频生成领域里,用LoRA(Low-Rank Adaptation…...
Docker 入门实战 完整步骤记录
一、安装与基础配置阶段 安装并启动 Docker Desktop 完成安装后,打开软件,确认主界面显示 Engine running(引擎运行中) 且状态为绿色。 配置国内镜像源(解决下载慢/超时问题) 点击右上角 Settings…...
Scrcpy进阶玩家指南:录屏、多设备管理、触摸显示等隐藏功能全解析
Scrcpy进阶玩家指南:录屏、多设备管理、触摸显示等隐藏功能全解析 如果你已经熟悉Scrcpy的基础操作,那么是时候解锁它的全部潜力了。这款开源工具远不止简单的手机投屏,它隐藏着一系列专业级功能,能够满足开发者、测试人员和内容创…...
别急着用T检验!用Python做数据分析前,先花5分钟检查这4个前提
别急着用T检验!用Python做数据分析前,先花5分钟检查这4个前提 数据分析师们常常陷入一个误区:拿到数据就迫不及待地运行T检验,仿佛这个统计工具是解决所有均值比较问题的万能钥匙。但真实世界的数据往往比教科书复杂得多——我曾在…...
2026年揭秘:超市塑料包装袋源头厂家究竟藏身何处?
在如今竞争激烈的商业世界里,塑料包装早已不再仅仅是一个简单的容器,它对于产品的品质保障、品牌形象塑造、成本控制以及安全合规等方面,都起着至关重要的作用。然而,市场上的包装厂家鱼龙混杂,真正能做到全品类覆盖、…...
血清替代物(人血小板裂解液)从工艺到细胞扩增性能替代FBS的可行性分析
在技术领域,我们常常被那些闪耀的、可见的成果所吸引。今天,这个焦点无疑是大语言模型技术。它们的流畅对话、惊人的创造力,让我们得以一窥未来的轮廓。然而,作为在企业一线构建、部署和维护复杂系统的实践者,我们深知…...
