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

力扣做题记录 (二叉树)

二叉树

打算先来了解二叉树基础,都是简单题,目的是熟悉代码格式和解题基础思路。

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);}
};

相关文章:

力扣做题记录 (二叉树)

二叉树 打算先来了解二叉树基础&#xff0c;都是简单题&#xff0c;目的是熟悉代码格式和解题基础思路。 1、二叉树最大深度 二叉树最大深度 方法一、深度搜索 直接用原函数做递归&#xff0c;比较简单 /*** Definition for a binary tree node.* struct TreeNode {* …...

机试刷题_字符串的排列【python】

题目&#xff1a;字符串的排列 from os import dup # # 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定的值即可 # # # param str string字符串 # return string字符串一维数组 # class Solution:def backtrack(self,res,state,choi…...

百度智能云—千帆 ModelBuilder API的简单调用(Java)

百度简介 百度&#xff08;Baidu&#xff09;是拥有强大互联网基础的领先AI公司。百度愿景是&#xff1a;成为最懂用户&#xff0c;并能帮助人们成长的全球顶级高科技公司。 “百度”二字&#xff0c;来自于八百年前南宋词人辛弃疾的一句词&#xff1a;众里寻他千百度。这句话…...

unity学习43:子状态机 sub-state machine

目录 1sub-state machine子状态机 1.1 创建 sub-state machine 1.2 sub-state machine 内容 1.3 子状态机的应用 2 子状态机不同于blend tree的嵌套 3 应用例子&#xff1a;若角色拿不同武器的动画设计&#xff0c;可以使用2种方法 3.1 在1个图层layer里&#xff0c;使用…...

Qt MainWindow

文章目录 0. 概述1. 菜单栏 QMenuBar1.1 例子1&#xff0c;使用图形化界面1.2 例子2&#xff0c;使用代码创建1.3 例子3&#xff0c;添加快捷键1.4 例子4&#xff0c;添加子菜单1.5 例子5&#xff0c;添加分割线和图标1.6 内存泄漏问题 2. 工具栏 QToolBar2.1 例子1&#xff0c…...

GDB QUICK REFERENCE (GDB 快速参考手册)

GDB QUICK REFERENCE {GDB 快速参考手册} References GDB QUICK REFERENCE GDB Version 4 https://users.ece.utexas.edu/~adnan/gdb-refcard.pdf 查看方式&#xff1a;在新标签页中打开图片 References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/ [2] gdb-refc…...

【数据结构】 栈和队列

在计算机科学的世界里&#xff0c;数据结构是构建高效算法的基础。栈&#xff08;Stack&#xff09;和队列&#xff08;Queue&#xff09;作为两种基本且重要的数据结构&#xff0c;在软件开发、算法设计等众多领域都有着广泛的应用。今天&#xff0c;我们就来深入探讨一下栈和…...

AI视频创作教程:如何用AI让古画动起来。

事情缘由&#xff1a; 如果是简单的图&#xff0c;找原图直接写提示词即可。 如果碰到多人多活动的图&#xff0c;直接出的效果会很不好&#xff0c;那么该怎么做呢&#xff1f; 图片分模块 首先&#xff0c;复杂部分的图&#xff0c;把长图分多个模块。 比如这张图&#xff0…...

撕碎QT面具(1):Tab Widget转到某个Tab页

笔者未系统学过C语法&#xff0c;仅有Java基础&#xff0c;具体写法仿照于大模型以及其它博客。自我感觉&#xff0c;如果会一门对象语言&#xff0c;没必要先刻意学C&#xff0c;因为自己具有对象语言的基础&#xff0c;等需要用什么再学也不迟。毕竟不是专门学C去搞算法。 1…...

DeepSeek24小时写作机器人,持续创作高质量文案

内容创作已成为企业、自媒体和创作者的核心竞争力。面对海量的内容需求&#xff0c;人工创作效率低、成本高、质量参差不齐等问题日益凸显。如何在有限时间内产出高质量内容&#xff1f;DeepSeek写作机器人&#xff0c;一款24小时持续创作的智能工具&#xff0c;为企业和个人提…...

npm安装依赖(npm install)时遇到认证错误的解决方案

问题描述 在使用 npm install 安装依赖时遇到以下错误&#xff1a; npm error code E401 npm error Incorrect or missing password.解决方案 方案一&#xff1a;使用淘宝&#xff08;或其它国内公共&#xff09;镜像&#xff08;如果已经是淘宝镜像跳过此步&#xff09; 设…...

SpringBoot+微信小程序+数据可视化的宠物到家喂宠服务(程序+论文+讲解+安装+调试+售后等)

感兴趣的可以先收藏起来&#xff0c;还有大家在毕设选题&#xff0c;项目以及论文编写等相关问题都可以给我留言咨询&#xff0c;我会一一回复&#xff0c;希望帮助更多的人。 系统介绍 在经济高速发展、物质生活极大丰富的当下&#xff0c;人们的精神需求愈发凸显&#xff0…...

免费大模型网站

腾讯元宝 腾讯元宝 秘塔搜索 秘塔搜索 超算互联网 超算互联网回答速度很慢 Chatbot Arena Chatbot Arena 大模型竞技场。...

OpenCV的主要模块

OpenCV的模块...

使用 Python 爬虫和 FFmpeg 爬取 B 站高清视频

以下是一个完整的 Python 爬虫代码示例&#xff0c;用于爬取 B 站视频并使用 FFmpeg 合成高清视频。 1. 准备工作 确保安装了以下 Python 库和工具&#xff1a; bash复制 pip install requests moviepy2. 爬取视频和音频文件 B 站的视频和音频文件通常是分开存储的&#x…...

Retrieval-Augmented Generation for LargeLanguage Models: A Survey

标题&#xff1a;Retrieval-Augmented Generation for Large Language Models: A Survey 作者&#xff1a;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)

嗯&#xff0c;用户让我介绍一下这段使用numpy的代码。首先&#xff0c;我需要确认用户的需求是什么。他们可能刚开始学习Python或者数据科学&#xff0c;所以需要基础的解释。让我仔细看一下代码。 第一行是import numpy as np&#xff0c;这应该是导入numpy库&#xff0c;并…...

C#windows窗体人脸识别

一、创建一个数据库&#xff0c;名为TestFaceDB 里面有一张表就OK了&#xff0c;表名Users,表里面有几个字段我说明一下&#xff1a; id--------------------bigint----------------------编号 name--------------varchar(50)-----------------用户名 phone--------------v…...

【第11章:生成式AI与创意应用—11.1 文本生成与创意写作辅助的实现与优化】

凌晨三点的书房,作家李明第27次删除了刚写好的段落。窗外路灯在稿纸上投下斑驳光影,就像他此刻支离破碎的创作灵感。突然,写作软件弹出提示:"检测到情感转折生硬,建议尝试’雨夜独白’场景模板?"这个由生成式AI驱动的建议,不仅拯救了濒临崩溃的章节,更揭开了…...

【Elasticsearch】通过运行时字段在查询阶段动态覆盖索引字段

在 Elasticsearch 中&#xff0c;Override field values at query time是指通过运行时字段&#xff08;runtime fields&#xff09;在查询阶段动态覆盖索引字段的值&#xff0c;而无需修改原始索引数据。这种功能特别适用于以下场景&#xff1a; 1. 动态修改字段值&#xff1a…...

SITS2026变革落地五步法:AISMM框架驱动下,如何用90天重构IT服务治理体系?

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;SITS2026变革落地五步法&#xff1a;AISMM框架驱动下&#xff0c;如何用90天重构IT服务治理体系&#xff1f; SITS2026作为新一代IT服务治理标准&#xff0c;其核心在于将AI原生能力深度嵌入服务成熟度…...

KS-Downloader:快手无水印视频下载的终极解决方案

KS-Downloader&#xff1a;快手无水印视频下载的终极解决方案 【免费下载链接】KS-Downloader 快手&#xff08;KuaiShou&#xff09;视频/图片下载工具&#xff1b;数据采集工具 项目地址: https://gitcode.com/gh_mirrors/ks/KS-Downloader 还在为下载快手视频时出现的…...

【软考高级架构】案例题考前突击13:SAAM / ATAM / CBAM

一、SAAM 架构情景分析法 1. 场景开发:与系统相关风险承担者共同协商,开发一组任务场景。 2. 架构描述:对系统架构进行正式描述,包含计算构件、数据构件及构件间交互关系。 3. 单个场景评估:逐一评估每个场景,判断架构对直接场景、间接场景的支持程度。 4. 场景交互:…...

NLP情感分析:从传统方法到深度学习

NLP情感分析&#xff1a;从传统方法到深度学习 1. 技术分析 1.1 情感分析任务 类型描述典型应用二分类积极/消极评论分析三分类积极/中性/消极舆情监测多标签多种情感混合复杂文本 1.2 方法对比 方法特点性能词典方法基于情感词典中等传统MLTF-IDFSVM良好深度学习Word2VecCNN/R…...

AI工具搭建自动化视频生成LoCon

# AI工具搭建自动化视频生成LoCon&#xff1a;一个深度实践者的视角 什么是LoCon LoCon这个词&#xff0c;第一次听到的人可能会觉得是某个新款的智能硬件。其实它是“LoRA Control”的缩写&#xff0c;专指在视频生成领域里&#xff0c;用LoRA&#xff08;Low-Rank Adaptation…...

Docker 入门实战 完整步骤记录

一、安装与基础配置阶段 安装并启动 Docker Desktop 完成安装后&#xff0c;打开软件&#xff0c;确认主界面显示 Engine running&#xff08;引擎运行中&#xff09; 且状态为绿色。 配置国内镜像源&#xff08;解决下载慢/超时问题&#xff09; 点击右上角 Settings&#xf…...

Scrcpy进阶玩家指南:录屏、多设备管理、触摸显示等隐藏功能全解析

Scrcpy进阶玩家指南&#xff1a;录屏、多设备管理、触摸显示等隐藏功能全解析 如果你已经熟悉Scrcpy的基础操作&#xff0c;那么是时候解锁它的全部潜力了。这款开源工具远不止简单的手机投屏&#xff0c;它隐藏着一系列专业级功能&#xff0c;能够满足开发者、测试人员和内容创…...

别急着用T检验!用Python做数据分析前,先花5分钟检查这4个前提

别急着用T检验&#xff01;用Python做数据分析前&#xff0c;先花5分钟检查这4个前提 数据分析师们常常陷入一个误区&#xff1a;拿到数据就迫不及待地运行T检验&#xff0c;仿佛这个统计工具是解决所有均值比较问题的万能钥匙。但真实世界的数据往往比教科书复杂得多——我曾在…...

2026年揭秘:超市塑料包装袋源头厂家究竟藏身何处?

在如今竞争激烈的商业世界里&#xff0c;塑料包装早已不再仅仅是一个简单的容器&#xff0c;它对于产品的品质保障、品牌形象塑造、成本控制以及安全合规等方面&#xff0c;都起着至关重要的作用。然而&#xff0c;市场上的包装厂家鱼龙混杂&#xff0c;真正能做到全品类覆盖、…...

血清替代物(人血小板裂解液)从工艺到细胞扩增性能替代FBS的可行性分析

在技术领域&#xff0c;我们常常被那些闪耀的、可见的成果所吸引。今天&#xff0c;这个焦点无疑是大语言模型技术。它们的流畅对话、惊人的创造力&#xff0c;让我们得以一窥未来的轮廓。然而&#xff0c;作为在企业一线构建、部署和维护复杂系统的实践者&#xff0c;我们深知…...