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

力扣做题记录 (二叉树)

二叉树

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

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 {* …...

国内情智机器人:从“通情达理”到温暖陪伴的跨越

近年来,随着人工智能技术的飞速发展,情智机器人(具备情感智能的机器人)逐渐成为国内研究和应用的热点领域。从情感计算的基础研究到人形机器人的实际应用,国内在这一领域取得了显著进展,展现出巨大的发展潜力。情智机器人不仅能够理解人类的情感,还能以温暖的方式提供陪…...

Unity中如何判断URL是否为RTSP或RTMP流

技术背景 如何在Unity中判断一个字符串URL是否是RTSP或RTMP流。首先&#xff0c;RTSP通常以“rtsp://”开头&#xff0c;而RTMP则是“rtmp://”或者有时是“rtmps://”用于安全连接。 接下来&#xff0c;如何在C#中进行字符串的检查。最简单的方法应该是检查URL是否以这些协议…...

前端里的this指向问题

目录 1.代码输出结果 2.代码输出结果 3.代码输出结果 4.代码输出结果 5.代码输出结果 6.代码输出结果 7.代码输出结果 8.代码输出结果 9.代码输出结果 10.代码输出结果 11.代码输出结果 12.代码输出结果 13.代码输出结果 14.代码输出结果 总结 1.代码输出结果 f…...

deepseek与gpt,核心原理对比

DeepSeek与GPT作为AI大模型,在自然语言处理等领域展现出强大的能力,它们的核心原理对比主要体现在模型架构、训练策略、资源效率以及应用场景优化等方面。 一、模型架构 DeepSeek 混合专家(MoE)框架:DeepSeek采用了混合专家框架,其内部包含多个“专家”子模块,每个子模…...

提示工程实现数据质量评估

提示工程实现数据质量评估 我准备先查看数据集的基本信息和内容,从完整性、准确性、一致性等方面评价数据质量,再依据数据规模、质量和潜在价值等因素进行定价。 import pandas as pd# 读取文件 excel_file = pd.ExcelFile(/mnt/a-极速-脑筋-98.xls)# 获取所有表名 sheet_n…...

[NKU]C++基础课(二)--- externC、强制类型转换、类与对象、面向对象程序设计语言、对象创建和使用、类的定义、封装

一、extern "C" &#xff08;没看懂&#xff09; extern "C" 是 C 语言中的一个特性&#xff0c;用于在 C 代码中声明使用 C 语言链接的变量或函数。这样做的目的主要是为了实现 C 代码与 C 代码之间的互操作性。 C 支持函数重载&#xff0c;而 C 不支持&…...

黑马Redis详细笔记(实战篇---短信登录)

目录 一.短信登录 1.1 导入项目 1.2 Session 实现短信登录 1.3 集群的 Session 共享问题 1.4 基于 Redis 实现共享 Session 登录 一.短信登录 1.1 导入项目 数据库准备 -- 创建用户表 CREATE TABLE user (id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT 用户ID,phone …...

什么是计算机总线?

计算机总线 文章目录 计算机总线1、总线的分类2、总线的组成3、总线的工作原理4、总线的性能指标 计算机总线是计算机各功能部件之间进行信息传输的公共通道&#xff0c;就像城市中的交通干线&#xff0c;负责连接计算机系统的各个组成部分&#xff0c;实现它们之间的数据、地址…...

ASP.NET配置文件多种方式读取

ASP.NET Core项⽬默认的配置⽂件是appsettings.json&#xff0c;创建项⽬时就会⾃动⽣成这个⽂ 件&#xff0c;我们可以将⼀些配置信息存放在这个配置⽂件中&#xff0c;这样做的好处是当我们修改配置⽂件 时&#xff0c;不在需要重启应⽤&#xff0c;可以实现热更新。 {"…...

基于N-gram模型的中文文本分析系统设计与实现

前言 在数字化人文研究快速发展的背景下&#xff0c;中文古典文本的量化分析面临着独特的挑战。古典文献中繁简异体字共存、语义单元边界模糊、意象隐喻密集等特征&#xff0c;使得传统的词频统计方法难以准确捕捉其深层语言规律。现有文本分析工具多面向现代汉语设计&#xff…...

零基础购买阿里云服务器,XShell连接云服务器

目录 1.环境搭建方式 2. 使用云服务器 3.使用终端软件登录到Linux 4.使用XShell登录主机 5.连接失败的原因&#xff1a; 下一篇更新&#xff1a;Linux的基础指令以及如何Linux的环境搭建 1.环境搭建方式 主要有四种: 1.直接安装在物理机上&#xff0c;虽然Linux有图形化…...

成熟开发者需具备的能力

精业务 • 指深入理解和熟悉所开发软件的业务逻辑和需求。 • 开发者需要明确软件要解决的问题、面向的用户群体以及核心功能等。 • 精业务有助于开发者更好地设计系统架构、编写符合业务需求的代码&#xff0c;并能根据业务变化灵活调整开发计划。 懂原理 • 指掌握编程的基…...

深入解析PID控制算法:从理论到实践的完整指南

前言 大家好&#xff0c;今天我们介绍一下经典控制理论中的PID控制算法&#xff0c;并着重讲解该算法的编码实现&#xff0c;为实现后续的倒立摆样例内容做准备。 众所周知&#xff0c;掌握了 PID &#xff0c;就相当于进入了控制工程的大门&#xff0c;也能为更高阶的控制理论…...

CNN手写数字识别1——模型搭建与数据准备

模型搭建 我们这次使用LeNet模型&#xff0c;LeNet是一个经典的卷积神经网络&#xff08;Convolutional Neural Network, CNN&#xff09;架构&#xff0c;最初由Yann LeCun等人在1998年提出&#xff0c;用于手写数字识别任务 创建一个文件model.py。实现以下代码。 源码 #…...

深度学习04 数据增强、调整学习率

目录 数据增强 常用的数据增强方法 调整学习率 学习率 调整学习率 ​调整学习率的方法 有序调整 等间隔调整 多间隔调整 指数衰减 余弦退火 ​自适应调整 自定义调整 数据增强 数据增强是通过对训练数据进行各种变换&#xff08;如旋转、翻转、裁剪等&#xff09;&am…...

Python 自然语言处理(NLP)和文本挖掘的常规操作过程

Python 自然语言处理&#xff08;NLP&#xff09;和文本挖掘 自然语言处理&#xff08;NLP&#xff09;和文本挖掘是数据科学中的重要领域&#xff0c;涉及对文本数据的分析和处理。Python 提供了丰富的库和工具&#xff0c;用于执行各种 NLP 和文本挖掘任务。以下是一些常见的…...

掌握SQLite_轻量级数据库的全面指南

1. 引言 1.1 SQLite简介 SQLite 是一个嵌入式关系型数据库管理系统,它不需要单独的服务器进程或系统配置。它的设计目标是简单、高效、可靠,适用于各种应用场景,尤其是移动设备和嵌入式系统。 1.2 为什么选择SQLite 轻量级:文件大小通常在几百KB到几MB之间。无服务器架构…...

PH热榜 | 2025-02-16

1. Cal.com Routing 标语&#xff1a;根据客户线索&#xff0c;系统会智能地自动安排约会。 介绍&#xff1a;告别繁琐的排期&#xff01;Cal.com 推出了新的路由功能&#xff0c;能更智能地分配预约&#xff0c;让你的日程安排更顺畅。这项功能运用智能逻辑和深入的数据分析…...

数据库基本概念及基本使用

数据库基本概念 什么是数据库&#xff1a; 数据库特点&#xff1a; 常见的数据库软件&#xff1a; 不同的公司进行不同的实践&#xff0c;生成了不同的产品。 比如买汽车&#xff0c;汽车只是一个概念&#xff0c;你要买哪个牌子哪个型号的汽车&#xff0c;才是真正的汽车的一…...

gozero实现数据库MySQL单例模式连接

在 GoZero 框架中实现数据库的单例连接可以通过以下步骤来完成。GoZero 使用 gorm 作为默认的数据库操作框架&#xff0c;接下来我会展示一个简单的单例模式实现。 ### 1. 定义数据库连接的单例结构 首先&#xff0c;你需要定义一个数据库连接的结构体&#xff0c;并在初始化…...

CSS flex布局 列表单个元素点击 本行下插入详情独占一行

技术栈&#xff1a;Vue2 javaScript 简介 在实际开发过程中有遇到一个场景&#xff1a;一个list&#xff0c;每行个数固定&#xff0c;点击单个元素后&#xff0c;在当前行与下一行之间插入一行元素详情&#xff0c;便于更直观的查看到对应的数据详情。 这种情形&#xff0c…...

无人机航迹规划: 梦境优化算法(Dream Optimization Algorithm,DOA)求解无人机路径规划MATLAB

一、梦境优化算法 梦境优化算法&#xff08;Dream Optimization Algorithm&#xff0c;DOA&#xff09;是一种新型的元启发式算法&#xff0c;其灵感来源于人类的梦境行为。该算法结合了基础记忆策略、遗忘和补充策略以及梦境共享策略&#xff0c;通过模拟人类梦境中的部分记忆…...

权限五张表

重点&#xff1a;权限五张表的设计 核心概念&#xff1a; 在权限管理系统中&#xff0c;经典的设计通常涉及五张表&#xff0c;分别是用户表、角色表、权限表、用户角色表和角色权限表。这五张表的设计可以有效地管理用户的权限&#xff0c;确保系统的安全性和灵活性。 用户&…...

Docker-数据卷

1.数据卷 容器是隔离环境&#xff0c;容器内程序的文件、配置、运行时产生的容器都在容器内部&#xff0c;我们要读写容器内的文件非常不方便。大家思考几个问题&#xff1a; 如果要升级MySQL版本&#xff0c;需要销毁旧容器&#xff0c;那么数据岂不是跟着被销毁了&#xff1…...

在Linux系统下修改Docker的默认存储路径

在Linux系统下修改Docker的默认存储路径可以通过多种方法实现&#xff0c;下边是通过修改daemon.json文件方式实现 查看当前Docker存储路径 使用命令 docker info | grep "Docker Root Dir" 查看当前Docker的存储路径&#xff0c;默认为 /var/lib/docker 停止Docker…...

IT : 是工作還是嗜好? Delphi 30周年快乐!

又到2月14日了, 自从30多年前收到台湾宝蓝(Borland)公司一大包的3.5 磁盘片, 上面用黑色油性笔写着Delphi Beta开始, Delphi便和我的工作生涯有了密不可分的关系. 一年后Delphi大获成功, 自此对于使用Delphi的使用者来说2月14日也成了一个特殊的日子! 我清楚记得Delphi Beta使用…...

DeepPose

目录 摘要 Abstract DeepPose 算法框架 损失函数 创新点 局限性 训练过程 代码 总结 摘要 DeepPose是首个将CNN应用于姿态估计任务的模型。该模型在传统姿态估计方法的基础上&#xff0c;通过端到端的方式直接从图像中回归出人体关键点的二维坐标&#xff0c;避免了…...

[HarmonyOS]鸿蒙(添加服务卡片)推荐商品 修改卡片UI(内容)

什么是服务卡片 &#xff1f; 鸿蒙系统中的服务卡片&#xff08;Service Card&#xff09;就是一种轻量级的应用展示形式&#xff0c;它可以让用户在不打开完整应用的情况下&#xff0c;快速访问应用内的特定功能或信息。以下是服务卡片的几个关键点&#xff1a; 轻量级&#…...

DeepSeek R1 本地部署和知识库搭建

一、本地部署 DeepSeek-R1&#xff0c;是幻方量化旗下AI公司深度求索&#xff08;DeepSeek&#xff09;研发的推理模型 。DeepSeek-R1采用强化学习进行后训练&#xff0c;旨在提升推理能力&#xff0c;尤其擅长数学、代码和自然语言推理等复杂任务 。 使用DeepSeek R1, 可以大大…...