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

比特数据结构与算法(第四章_下)二叉树OJ(力扣:144,965,104,226,100,572)

144. 二叉树的前序遍历

难度简单

给你二叉树的根节点 root ,返回它节点值的 前序 遍历。

示例 1:

输入:root = [1,null,2,3]

输出:[1,2,3]

示例 2:

输入:root = [ ]

输出:[ ]

示例 3:

输入:root = [1]

输出:[1]

示例 4:

输入:root = [1,2]

输出:[1,2]

示例 5:

输入:root = [1,null,2]

输出:[1,2]

提示:

  • 树中节点数目在范围 [0, 100] 内

  • -100 <= Node.val <= 100

进阶:递归算法很简单,你可以通过迭代算法完成吗?

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*/
/*** Note: The returned array must be malloced, assume caller calls free().*/
int* preorderTraversal(struct TreeNode* root, int* returnSize){}

解析代码:

ps(迭代算法我们要学了C++之后的高阶数据结构再实现)

int TreeSize(struct TreeNode* root)
{if(root==NULL){return 0;}return 1 + TreeSize(root->left) + TreeSize(root->right);
}void _preorderTraversal(struct TreeNode* root,int* array,int* pi) // (函数前面的_代表这个函数的子函数)
{if(root==NULL){return;}array[(*pi)++] = root->val;_preorderTraversal(root->left,array,pi);_preorderTraversal(root->right,array,pi);
}int* preorderTraversal(struct TreeNode* root, int* returnSize){int size = TreeSize(root);int* array=(int*)malloc(sizeof(int)*size);int i = 0;_preorderTraversal(root,array,&i);*returnSize=size;return array;
}

(写完这题可以去写写二叉树的中序遍历和后序遍历,都是一样的)链接:

94. 二叉树的中序遍历

965. 单值二叉树

难度简单

如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。

只有给定的树是单值二叉树时,才返回 true;否则返回 false。

示例 1:

输入:[1,1,1,1,1,null,1]

输出:true

示例 2:

输入:[2,2,2,5,2]

输出:false

提示:

  1. 给定树的节点数范围是 [1, 100]。

  1. 每个节点的值都是整数,范围为 [0, 99] 。

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*/bool isUnivalTree(struct TreeNode* root){}

解析代码:

bool isUnivalTree(struct TreeNode* root) {if (root == NULL){return true;}if (root->left && root->val != root->left->val){return false;}if (root->right && root->val != root->right->val){return false;}return isUnivalTree(root->left) && isUnivalTree(root->right);
}

104. 二叉树的最大深度

难度简单

给定一个二叉树,找出其最大深度。

二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。

说明: 叶子节点是指没有子节点的节点。

示例:

给定二叉树 [3,9,20,null,null,15,7],

3

/ \

9 20

/ \

15 7

返回它的最大深度 3 。

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*/int maxDepth(struct TreeNode* root){}

解析代码:

/*int maxDepth(struct TreeNode* root) {if (root == NULL){return 0;}return maxDepth(root->left) > maxDepth(root->right) ? maxDepth(root->left) + 1 : maxDepth(root->right) + 1;
}*/  //这样写会有重复的递归计算,  优化:
int maxDepth(struct TreeNode* root) {if (root == NULL){return 0;}int leftDepth = maxDepth(root->left);int rightDepth = maxDepth(root->right);return leftDepth > rightDepth ? leftDepth + 1 : rightDepth + 1;
}

226. 翻转二叉树

难度简单

给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。

示例 1:

输入:root = [4,2,7,1,3,6,9]

输出:[4,7,2,9,6,3,1]

示例 2:

输入:root = [2,1,3]

输出:[2,3,1]

示例 3:

输入:root = []

输出:[]

提示:

  • 树中节点数目范围在 [0, 100] 内

  • -100 <= Node.val <= 100

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*/struct TreeNode* invertTree(struct TreeNode* root){}

解析代码(法一):

struct TreeNode* invertTree(struct TreeNode* root) {if (root == NULL){return NULL;}struct TreeNode* tmp = root->left;root->left = root->right;root->right = tmp;invertTree(root->left);invertTree(root->right);return root;
}

解析代码(法二):

struct TreeNode* invertTree(struct TreeNode* root) {if (root == NULL){return NULL;}struct TreeNode* rightTmp = root->right;root->right = invertTree(root->left);root->left = invertTree(rightTmp);return root;
}

100. 相同的树

难度简单

给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。

如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。

示例 1:

输入:p = [1,2,3], q = [1,2,3]

输出:true

示例 2:

输入:p = [1,2], q = [1,null,2]

输出:false

示例 3:

输入:p = [1,2,1], q = [1,1,2]

输出:false

提示:

  • 两棵树上的节点数目都在范围 [0, 100] 内

  • -10^4 <= Node.val <= 10*4

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*/bool isSameTree(struct TreeNode* p, struct TreeNode* q){}

解析代码:

bool isSameTree(struct TreeNode* p, struct TreeNode* q) {if (p == NULL && q == NULL){return true;}if (p == NULL || q == NULL)//其中一个为空,另一个不为空{return false;}if (p->val != q->val){return false;}return isSameTree(p->left, q->left)&& isSameTree(p->right, q->right);
}

572. 另一棵树的子树

难度简单

给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在,返回 true ;否则,返回 false 。

二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有后代节点。tree 也可以看做它自身的一棵子树。

示例 1:

输入:root = [3,4,5,1,2], subRoot = [4,1,2]

输出:true

示例 2:

输入:root = [3,4,5,1,2,null,null,null,null,0], subRoot = [4,1,2]

输出:false

提示:

  • root 树上的节点数量范围是 [1, 2000]

  • subRoot 树上的节点数量范围是 [1, 1000]

  • -10^4 <= root.val <= 10^4

  • -10^4 <= subRoot.val <= 10^4

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*/bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot) {}

解析代码:

bool isSameTree(struct TreeNode* p, struct TreeNode* q)
{if (p == NULL && q == NULL){return true;}if (p == NULL || q == NULL)//其中一个为空,另一个不为空{return false;}if (p->val != q->val){return false;}return isSameTree(p->left, q->left)&& isSameTree(p->right, q->right);
}bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot) {if (root == NULL){return false;}if (isSameTree(root, subRoot)){return true;}//不一样就递归遍历这棵树return isSubtree(root->left, subRoot)|| isSubtree(root->right, subRoot);//只要有一个root返回true就行
}

相关文章:

比特数据结构与算法(第四章_下)二叉树OJ(力扣:144,965,104,226,100,572)

144. 二叉树的前序遍历难度简单给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历。示例 1&#xff1a;输入&#xff1a;root [1,null,2,3]输出&#xff1a;[1,2,3]示例 2&#xff1a;输入&#xff1a;root [ ]输出&#xff1a;[ ]示例 3&#xff1a;输入&#…...

【C++】inline 内联函数

文章目录&#x1f4d5; 概念&#x1f4d5; 使用前的准备&#x1f4d5; 使用&#x1f4d5; 特性&#x1f4d5; 概念 在 C 中&#xff0c;为了解决一些频繁调用的小函数大量消耗栈空间&#xff08;栈内存&#xff09;的问题&#xff0c;特别的引入了 inline 修饰符&#xff0c;表…...

如何审计一个智能合约

智能合约审计用于整个 DeFi 生态系统&#xff0c;通过对协议代码的深入审查&#xff0c;可以帮助解决识别错误、低效代码以及这些问题。智能合约具有不可篡改的特点&#xff0c;这使得审计成为任何区块链项目安全流程的关键部分。 代码审计对任何应用程序都很重要&#xff0c;…...

不用PS,也能实现抠图的工具

对于非设计专业的同学来说&#xff0c;专门下载 PS 抠图有点大材小用&#xff0c;而且运用 PS 对电脑配置一定要求。不过现在有了更多选择&#xff0c;市面上出现了越来越多的抠图软件&#xff0c;不过越多的抠图软件选择也意味着需要花费时间试错因此本文将给大家推荐 3 款非常…...

集群化存储的概述

集群化存储的概述 1、存储的分类方式&#xff1a; 存储的分类-网络拓扑 用于存储的网络拓扑 NAS&#xff1a;小米路由器&#xff1b;SAN&#xff1a;存储区网络–>网络网和存储网络区分开DAS&#xff1a;常见的存储&#xff1b;本地存储 存储分类-存储技术网络拓扑存储技…...

asyncio 并发编程(一)

Python2 时代高性能的网络编程主要是 Twisted、Tornado 和 Gevent 这三个库&#xff0c;但是它们的异步代码相互之间既不兼容也不能移植。Gvanrossum 希望在 Python 3 实现一个原生的基于生成器的协程库&#xff0c;其中直接内置了对异步 IO 的支持&#xff0c;这就是 asyncio&…...

春招冲刺(二):BFC 盒子面试题总结

BFC 盒子面试题总结 Q1&#xff1a;BFC盒子是什么&#xff1f; BFC全称是Block Formatting Context 意思就是块级格式化上下文。 可以把BFC看做一个容器&#xff0c;容器里边的元素不会影响到容器外部的元素。 Q2&#xff1a;如何创建BFC&#xff1f; 根元素&#xff1a;bo…...

Ep_计网面试题-本地IP地址怎么一层层向上转换?

将数据加上报头打包在一起形成新的数据包继续往下一层传递。拆包的时候就是把数据包去掉包头作为新数据传给上一层 视频讲解: https://edu.csdn.net/course/detail/38090 点我进入 面试宝典 很多人不知道面试问什么,或者其他的XXGuide,那里边的太多没用的,也没有源码解析,都…...

MySQL高级三

目录 三、MySQL高级03 3.1 MyCat 3.1.1 MyCat简介 3.1.2 中间件的作用 3.2 安装MyCat 3.3 主从复制 3.3.1 主从复制的原理 3.3.2 主从复制的好处 3.3.3 配置主从复制 三、MySQL高级03 如果虚拟机的磁盘已满&#xff0c;可以对磁盘进行重新分配 参考&#xff1a;虚拟…...

set和map的基本使用

目录 关联式容器 要点分析 键值对 pair介绍 set 模板参数列表&#xff1a; set的构造&#xff1a; 常用接口 操作 multiset map map的构造 插入 make_pair map的迭代器 operator[] multimap multimap中为什么没有重载operator[] 关联式容器 关联式容器也是用…...

已解决pip install wxPython模块安装失败

已解决&#xff08;pip install wxPython安装失败&#xff09;error: legacy-instal1-failure Encountered error while trying to install package.wxPython note: This is an issue with the package mentioned above&#xff0c;not pip. hint : See above for output from …...

Linux基础——连接Xshell7

个人简介&#xff1a;云计算网络运维专业人员&#xff0c;了解运维知识&#xff0c;掌握TCP/IP协议&#xff0c;每天分享网络运维知识与技能。座右铭&#xff1a;海不辞水&#xff0c;故能成其大&#xff1b;山不辞石&#xff0c;故能成其高。个人主页&#xff1a;小李会科技的…...

C++——智能指针1

目录 RAII auto_ptr模拟实现 智能指针拷贝问题 唯一指针 shared_ptr&#xff08;可以拷贝&#xff09; shared_ptr模拟实现 完整代码 循环引用 weak_ptr模拟实现 定制删除器 shared_ptr定制删除器模拟实现 内存泄漏 RAII RAII&#xff08;Resource Acquisit…...

[数据集][VOC][目标检测]翻越栏杆翻越防护栏数据集目标检测可用yolo训练-1035张介绍

数据集格式&#xff1a;Pascal VOC格式(不包含分割路径的txt文件和yolo格式的txt文件&#xff0c;仅仅包含jpg图片和对应的xml) 图片数量(jpg文件个数)&#xff1a;1035 标注数量(xml文件个数)&#xff1a;1035 标注类别数&#xff1a;2 标注类别名称:["fylg","…...

深度学习 | BN层原理浅谈

深度学习 | BN层原理浅谈 文章目录深度学习 | BN层原理浅谈一. 背景二. BN层作用三. 计算原理四. 注意事项为什么BN层一般用在线性层和卷积层的后面&#xff0c;而不是放在激活函数后为什么BN能抑制过拟合(有争议)一. 背景 神经网络在训练时&#xff0c;由于内存限制&#xff0…...

每日面试题

2022/12/15 如何实现一个IOC容器 1、配置文件配置包扫描路径 2、递归包扫描获取.class文件 3、反射、确定需要交给lOC管理的类4、对需要注入的类进行依赖注入 配置文件中指定需要扫描的包路径 定义一些注解&#xff0c;分别表示访问控制层、业务服务层、数据持久层、依赖注…...

将IDEA的项目托管到gitee

目录1. 在gitee上创建仓库2. 本地创建仓库目录3. 将项目添加到缓冲区4. 将缓冲区的项目添加到本地仓库5. 将本地仓库的项目上传到gitee6. 遇到的问题6.1 问题描述6.2 解决方法7. 相关图示与补充8. 相关参考1. 在gitee上创建仓库 2. 本地创建仓库目录 在IDEA中选择创建 Git 仓…...

父类子类静态代码块、构造代码块、构造方法执行顺序

github:https://github.com/nocoders/java-everything.git 名词解释 静态代码块&#xff1a;java中使用static关键字修饰的代码块&#xff0c;每个代码块只会执行一次&#xff0c;JVM加载类时会执行静态代码块中的代码&#xff0c;静态代码块先于主方法执行。构造代码块&#…...

【C++】开散列实现unordered_map与unordered_set的封装

本文主要介绍unordered_map与unordered_set的封装&#xff0c;此次封装主要用上文所说到的开散列,通过开散列的一些改造来实现unordered_map与unordered_set的封装 文章目录一、模板参数二、string的特化三、正向迭代器四、构造与析构五、[]的实现六、unordered_map的实现七、u…...

华为OD机试真题Python实现【删除指定目录】真题+解题思路+代码(20222023)

删除指定目录 题目 某文件系统中有 N 个目录, 每个目录都一个独一无二的 ID。 每个目录只有一个付目录, 但每个目录下可以有零个或多个子目录, 目录结构呈树状结构。 假设 根目录的 ID 为0,且根目录没有父目录 ID 用唯一的正整数表示,并统一编号 现给定目录 ID 和其付目…...

ncmdumpGUI:实现NCM格式自由转换的音频解决方案

ncmdumpGUI&#xff1a;实现NCM格式自由转换的音频解决方案 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换&#xff0c;Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 痛点剖析&#xff1a;NCM格式的技术民主化阻碍 格…...

TargetMol明星分子—— Eragidomide Mezigdomide

Eragidomide &#xff0c;别名 CC-90009、 Cereblon modulator 1&#xff0c;是一种 GSPT1 选择性 cereblon (CRBN) E3 泛素连接酶调节剂&#xff0c;以分子胶的方式作用。它通过 CRL4CRBN 选择性靶向 GSPT1 进行泛素化和蛋白酶体降解。 Mezigdomide 货号 T10703&#xff0c;别…...

Zrlog面试问答及问题解决方案

面试问答 结合 ZrLog 部署&#xff08;Maven 构建 环境配置 服务部署&#xff09;的全流程&#xff0c;整理排查 / 运维 / 开发三类高频问题&#xff0c;覆盖场景、原因、解答思路&#xff0c;可直接用于沟通或故障定位&#xff1a; 一、环境准备阶段高频问题 1. 执行 jav…...

为什么你的BUCK电路不稳定?峰值电流模式Fm增益的5个关键影响因素

为什么你的BUCK电路不稳定&#xff1f;峰值电流模式Fm增益的5个关键影响因素 在电源设计领域&#xff0c;BUCK电路的稳定性问题一直是工程师们头疼的难题。尤其是采用峰值电流模式控制的BUCK转换器&#xff0c;其调制器增益Fm的合理设置直接关系到整个系统的动态响应和稳定性。…...

构建高可用Chatbot UI完整模板:从架构设计到生产环境部署

痛点分析&#xff1a;Chatbot UI开发中的那些“坑” 在动手开发一个Chatbot UI之前&#xff0c;我们得先聊聊那些让开发者头疼的常见问题。如果你做过类似项目&#xff0c;下面这些场景一定不陌生&#xff1a; 状态管理失控&#xff1a;对话历史、用户输入、AI回复状态、连接…...

Android 11 自动亮度算法优化与曲线配置解析

1. Android 11自动亮度技术演进 记得第一次用上Android 11的手机时&#xff0c;最让我惊喜的就是屏幕亮度调节变得特别"聪明"。以前在电影院掏出手机总被刺得睁不开眼&#xff0c;现在却能像人眼一样自然地适应环境。这背后其实是Google对自动亮度算法做了重大升级&a…...

Stable Diffusion像素艺术工作流:Pixel Fashion Atelier预设Prompt指令集详解

Stable Diffusion像素艺术工作流&#xff1a;Pixel Fashion Atelier预设Prompt指令集详解 1. 像素艺术创作新体验 Pixel Fashion Atelier为设计师和艺术创作者带来了一种全新的像素艺术创作方式。这个基于Stable Diffusion与Anything-v5的工作站&#xff0c;将复古日系RPG的视…...

屏幕水印是什么?有啥用?如何设置屏幕水印?「干货图文教程」

屏幕水印是什么&#xff1f;屏幕水印&#xff0c;就是在电脑屏幕上显示的文字、图案或标志&#xff0c;就像在纸上盖章一样&#xff0c;但它出现在你的屏幕上。它可以帮助你在处理敏感信息时&#xff0c;增加一层额外的安全保护。屏幕水印有啥用&#xff1f;屏幕水印在企业信息…...

快充时代必备!5款USB保护芯片横评:从PW1502到PW1555怎么选?

快充时代USB保护芯片选型指南&#xff1a;5款主流方案深度解析 在快充技术普及的今天&#xff0c;USB接口的电压规格从传统的5V一路攀升至20V甚至更高。这种变化虽然带来了更快的充电速度&#xff0c;却也埋下了设备损坏的隐患——一个不小心将20V快充头插入仅支持5V的设备&…...

OpenClaw+nanobot智能客服:个人网站问答机器人搭建

OpenClawnanobot智能客服&#xff1a;个人网站问答机器人搭建 1. 为什么选择OpenClawnanobot组合 去年运营个人技术博客时&#xff0c;我经常收到读者在非工作时间发来的技术咨询。作为独立开发者&#xff0c;很难做到7x24小时在线回复&#xff0c;但让用户等待又会影响体验。…...