leetcode刷题第十三天——二叉树Ⅲ
本次刷题顺序是按照卡尔的代码随想录中给出的顺序
翻转二叉树
226. 翻转二叉树
/*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*//*总体思路就是,对于每一个结点,将其左右孩子结点对换*/struct TreeNode* invertTree(struct TreeNode* root) {if(root == NULL) return NULL;struct TreeNode* tmp;//交换左右子树tmp = root->left;root->left = root->right;root->right = tmp;//在对左右子树分别进行翻转root->left = invertTree(root->left);root->right = invertTree(root->right);return root;
}
对称二叉树
d101. 对称二叉树
/*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*//*总体思路,对于当前结点而言,其左孩子与右孩子的结点值相同*左孩子的(左、右)孩子的结点值与右孩子的(右、左)孩子的结点值相同*/bool isSymmetree(struct TreeNode* p, struct TreeNode* q) {if(p == NULL && q == NULL) return true;else if(p != NULL && q != NULL) {return (p->val == q->val && isSymmetree(p->left, q->right) \&& isSymmetree(p->right, q->left));}else {return false;}
}bool isSymmetric(struct TreeNode* root) {return isSymmetree(root->left, root->right);
}
相同的树
100. 相同的树
/*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*//*对于两棵树,相同则说明,对于两棵树中每个相应的结点,其值必须相同*结点的左、右孩子也必须完全相同*/bool isSameTree(struct TreeNode* p, struct TreeNode* q) {if(p == NULL && q == NULL) return true;else if(p != NULL && q != NULL) {return (p->val == q->val && isSameTree(p->right, q->right) \&& isSameTree(p->left, q->left));}else {return false;}
}
另一颗树的子树
572. 另一棵树的子树
/*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*//*建立在“判断两棵树是相同的树”的基础之上,*总体思路:如果以当前结点为根的树与指定树subRoot相同,则直接返回true*否则,分别查看以当前结点的左、右孩子结点为根的树与subRoot是否相同,有则返回true*否则,返回false*/bool isSameTree(struct TreeNode* p, struct TreeNode* q) {if(p == NULL && q == NULL) return true;else if(p != NULL && q != NULL) {return (p->val == q->val && isSameTree(p->left, q->left) && \isSameTree(p->right, q->right));}else return false;
}bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot) {if(isSameTree(root, subRoot)) return true;if(root != NULL) {return (isSubtree(root->left, subRoot) || isSubtree(root->right, subRoot));}else return false;
}
二叉树的最大深度
104. 二叉树的最大深度
/*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*//*利用层序遍历的框架,即可统计最大深度,因为内层循环就是遍历一层的结点,外层循环就是遍历所有层,*故而,每进行依次外层循环,层数加1,跳出外层循环后,返回层数即为最大深度*/int maxDepth(struct TreeNode* root) {if(root == NULL) return 0;struct TreeNode** st = malloc(sizeof(struct TreeNode*) * 10001);struct TreeNode* tmp;int rear = -1, mid_rear, front = -1, sum = 0;st[++rear] = root;mid_rear = rear;while(rear != front) {while(mid_rear != front) {tmp = st[++front];//判断子树是否需要入队列if(tmp->left) st[++rear] = tmp->left;if(tmp->right) st[++rear] = tmp->right;}sum++;mid_rear = rear;}return sum;
}
二叉树的最小深度
111. 二叉树的最小深度
/*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*//*也是建立在层次遍历的基础之上,如果内层循环在遍历当前层结点时,*出现某个结点左、右子树均为NULL,则直接返回当前层的深度*/int minDepth(struct TreeNode* root) {if(root == NULL) return 0;struct TreeNode** st = malloc(sizeof(struct TreeNode*) * 100001);struct TreeNode* tmp;int rear = -1, mid_rear, front = -1, sum = 0;st[++rear] = root;mid_rear = rear;while(rear != front) {sum++;while(mid_rear != front) {tmp = st[++front];//判断子树是否需要入队列if(tmp->left) st[++rear] = tmp->left;if(tmp->right) st[++rear] = tmp->right;if(!tmp->left && !tmp->right) return sum;}mid_rear = rear;}return sum;
}
完全二叉树的结点个数
222. 完全二叉树的节点个数
/*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*//*利用满二叉树的性质进行求解*当前结点,如果左、右深度一致,说明是满二叉树,直接由公式得到节点数*如果左、右深度不一致,则返回左子树结点数+右子树结点数+1**为什么可以这么做?因为,完全二叉树除了最后一层未满,其它层均是满的*/int countNodes(struct TreeNode* root) {if(root == NULL) return 0;struct TreeNode* l_child = root->left, * r_child = root->right;int l_cnt = 0, r_cnt = 0;while(l_child != NULL) {l_cnt++;l_child = l_child->left;}while(r_child != NULL) {r_cnt++;r_child = r_child->right;}//若向左和向右遍历深度一致,说明是满二叉树,可以直接求解结点个数if(l_cnt == r_cnt) return (2 << l_cnt) - 1;else return (countNodes(root->left) + countNodes(root->right) + 1);
}
平衡二叉树
110. 平衡二叉树
/*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*//*对于每个结点,求其左右子树的高度*所有结点,左右子树高度差不应超过1*///求得树的高度
int treeDeepth(struct TreeNode* p) {if(p == NULL) return 0;else return fmax(treeDeepth(p->left), treeDeepth(p->right)) + 1;
}bool isBalanced(struct TreeNode* root) {if(root == NULL) return true;//对于当前结点,两棵子树的高度差小于等于1,则判断结点的左右子树是否为平衡二叉树if(fabs(treeDeepth(root->left) - treeDeepth(root->right)) <= 1) {return isBalanced(root->left) && isBalanced(root->right);}else return false;//对于当前结点,两棵子树的高度差大于1,则直接返回错误
}
左叶子之和
404. 左叶子之和
/*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/
int sumOfLeftLeaves(struct TreeNode* root) {//如果为空,则必定返回0if(root == NULL) return 0;//如果当前结点的左孩子左右子树均为空,则当前结点的左孩子是左叶子if(root->left != NULL && root->left->left == NULL && root->left->right == NULL) {return root->left->val + sumOfLeftLeaves(root->right);}else {//如果当前结点左孩子为空,或者其左孩子左右子树不为空return sumOfLeftLeaves(root->left) + sumOfLeftLeaves(root->right);}
}
找树左下角的值
513. 找树左下角的值
/*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*//*找最左下结点的值,依照层次遍历的框架,最后一层的第一个结点就是最左下的结点*/int findBottomLeftValue(struct TreeNode* root) {struct TreeNode** qu = malloc(sizeof(struct TreeNode*) * 10000);struct TreeNode* tmp;int rear = -1, mid_rear, front = -1, res;qu[++rear] = root;do {mid_rear = rear;res = qu[front + 1]->val;while(front != mid_rear) {tmp = qu[++front];if(tmp->left) qu[++rear] = tmp->left;if(tmp->right) qu[++rear] = tmp->right;}}while(rear != front);return res;
}
最大二叉树
654. 最大二叉树
/*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*//*按照先序遍历的思想,先构造根节点,再构造左子树,最后构造右子树*需要配合查找数组最大值下标的程序进行构造*/int FindMaxIdx(int* nums, int start, int end) {int idx = start, max = INT_MIN, max_idx;while(idx <= end) {if(nums[idx] > max) {max = nums[idx];max_idx = idx;}idx++;}return max_idx;
}struct TreeNode* constructMaximumBinaryTree(int* nums, int numsSize) {if(numsSize == 0) return NULL;int max_idx = FindMaxIdx(nums, 0, numsSize - 1);struct TreeNode* root = malloc(sizeof(struct TreeNode));root->val = nums[max_idx];root->left = constructMaximumBinaryTree(nums, max_idx);root->right = constructMaximumBinaryTree(nums + max_idx + 1, numsSize - max_idx - 1);return root;
}
合并二叉树
617. 合并二叉树
/*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*//*在遍历过程中,两个结点均存在,则返回结点值为两者之和,*只有一者存在,直接返回该结点,*两者均不存在,则直接返回NULL*/struct TreeNode* mergeTrees(struct TreeNode* root1, struct TreeNode* root2) {if(root1 == NULL && root2 == NULL) return NULL;struct TreeNode* root = malloc(sizeof(struct TreeNode));if(root1 != NULL && root2 != NULL) {root->val = root1->val + root2->val;root->left = mergeTrees(root1->left, root2->left);root->right = mergeTrees(root1->right, root2->right);}else {if(root1 != NULL) {root = root1;}else root = root2;}return root;
}
递归用得挺多的,后面可以尝试迭代算法的实现。
递归需要考虑,递归的终止条件是什么?递归程序的单层逻辑是什么?
需要熟练掌握二叉树的四种遍历方式的框架,一般都是以此为突破口进行编程
相关文章:
leetcode刷题第十三天——二叉树Ⅲ
本次刷题顺序是按照卡尔的代码随想录中给出的顺序 翻转二叉树 226. 翻转二叉树 /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*//*总体思路就是,对于每一个结点&…...
SIM盾构建安全底座的可行性分析
一、背景 1.1安全需求现状 在数字化时代,信息安全面临着日益严峻的挑战。各类网络攻击手段层出不穷,如数据泄露、恶意软件攻击、网络诈骗等,给个人、企业和社会带来了巨大的损失。为了保障信息系统的安全性,需要构建一个可靠的安…...
全新的Android UI框架Jetpack Compose
Jetpack Compose 概述Compose API设计原则Compose 和 View 的关系Compose预览 概述 Jetpack Compose 是Android新一代UI框架,采用了 声明式 的开发范式,基于Kotlin DSL打造,并且可以和现有的Android View 体系共存。 Compose API设计原则 …...
在高流量下保持WordPress网站的稳定和高效运行
随着流量的不断增加,网站的稳定和高效运行变得越来越重要,特别是使用WordPress搭建的网站。流量过高时,网站加载可能会变慢,甚至崩溃,直接影响用户体验和网站正常运营。因此,我们需要采取一些有效的措施&am…...
Cython学习笔记1:利用Cython加速Python运行速度
Cython学习笔记1:利用Cython加速Python运行速度 CythonCython 的核心特点:利用Cython加速Python运行速度1. Cython加速Python运行速度原理2. 不使用Cython3. 使用Cython加速(1)使用pip安装 cython 和 setuptools 库(2&…...
Django 5实用指南(五)模板系统
Django5的模板系统是其核心功能之一,允许开发者将动态数据嵌入到HTML模板中,并根据不同的业务需求渲染页面。Django模板系统基于 Django模板语言(DTL),它提供了一些强大的功能,如模板标签、过滤器、条件语句…...
基于深度学习进行呼吸音检测的详细示例
以下是一个基于深度学习进行呼吸音检测的详细示例,我们将使用Python语言以及一些常见的深度学习库(如TensorFlow、Keras)和数据处理库(如numpy、pandas),同时会用到音频处理库librosa。整个流程包括数据加载…...
iOS 中使用 FFmpeg 进行音视频处理
在 iOS 中使用 FFmpeg 进行音视频处理,通常需要将 FFmpeg 的功能集成到项目中。由于 FFmpeg 是一个 C 库,直接在 iOS 中使用需要进行一些配置和封装。 1. 在 iOS 项目中集成 FFmpeg 方法 1:使用 FFmpeg 预编译库 下载 FFmpeg iOS 预编译库: 可以从以下项目中获取预编译的 …...
web的分离不分离:前后端分离与不分离全面分析
让我们一起走向未来 🎓作者简介:全栈领域优质创作者 🌐个人主页:百锦再新空间代码工作室 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[1504566…...
记录一个ES分词器不生效的解决过程
问题背景 商城项目,其中商品查询检索使用的是ES, 但存在某些商品查询不到的问题 例如:某商品名包含AA_BBB这样的关键词,但是搜索"AA"不能查询到该商品,但是将商品名修改为AA BBB后就能查询到了. 怀疑是分词的问题,但看代码,在创建ES索引时在对应字段上也定义了分词器…...
高性能内存对象缓存Memcached详细实验操作
目录 前提准备: cache1,2: 客户端cache-api(一定得是LAMP环境) memcache实现主主复制以及高可用(基于以上完成) cache1,2: memcachekeepalived(基于以上完成) cache1,2: 前提准备: 1. 准备三台cent…...
css之display:grid布局改块级元素布局
1.问题: div是块级元素,一个div元素占一行,但是,今天测试样式时,总是会有两个div并占一行,很困惑,结果发现是app这个样式 在main.css里 #app样式布局在main.ts里被应用 2.原因以及样式分析 im…...
高效率:转换效率高达 96%,可有效减少能源损耗
WD5030 的特点 高效率:转换效率高达 96%,可有效减少能源损耗,降低设备发热,提高能源利用效率,延长电池供电设备的续航时间135。 精准输出电压:内置可调线路补偿和可调输出电压功能,输出电压精度…...
推荐一个github star45k+进阶的java项目及知识的网站
mall是github上star 45k的一个java项目 mall项目是一套电商系统,包括前台商城系统及后台管理系统,基于SpringBootMyBatis实现,采用Docker容器化部署。 前台商城系统包含首页门户、商品推荐、商品搜索、商品展示、购物车、订单流程、会员中心…...
第2章 深入理解Thread构造函数
Thread的构造函数。 2.1 线程的命名 在构造一个Thread时可以为其命名。 2.1.1 线程的默认命名 下面构造函数中,并没有为线程命名。 Thread() Thread(Runnable target) Thread(ThreadGroup group, Runnable target)打开源码会看到 public Thread(Runnable targe…...
node 使用 Redis 缓存
缓存是什么? 高并发下,一个项目最先出问题的,并不是程序本身,而是数据库最先承受不住。 在数据库上我们可以做很多优化,例如优化 SQL 语句,优化索引,如果数据量大了,还可以分库、分表…...
PMBOK第7版整体架构全面详解
1. 引言 7月1日对于项目管理从业者和研究者而言,是个非凡意义的一个时间,这一天,翘首以待的《 项 目管理知识体系指南 》(PMBOK)第七版终于发布了。 总体而言,PMBOK第七版集百家之所长,成一…...
【Scrapy】Scrapy教程6——提取数据
前一小节我们拿到了页面的数据,那页面中那么多内容,我们想要其中的部分内容,该如何获取呢?这就需要对我们下载到的数据进行解析,提取出来想要的数据,这节就讲讲如何提取数据。 引入 我们编辑保存下来的shouye.html文件看下,发现这是什么鬼,全是如下图的代码。 没错…...
golang panic信息捕获
背景 我们的日志接入阿里云sls平台,但是,日志是以json的格式存储在阿里云sls平台上,程序中产生的error,info等日志都可以实现以json的格式打印。但是,golang程序中产生的panic信息本身不是以json的格式输出,这就导致p…...
一周学会Flask3 Python Web开发-http响应状态码
锋哥原创的Flask3 Python Web开发 Flask3视频教程: 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 在Flask程序中,客户端发出的请求触发相应的视图函数,获取返回值会作为响应的主体,最后生成…...
goland无法debug项目
1、其实个原因是因为正在使用的Delve调试器版本太旧,无法兼容当前的Go语言版本1.2。Delve是Go语言的一个调试工具,用于提供源码级别的调试功能。Go语言每隔一段时间会发布新版本,而相应的调试器Delve也可能会更新以提供新的特性或修复已知问题…...
迪威模型网:免费畅享 3D 打印盛宴,科技魅力与趣味创意并存
还在为寻找优质3D打印模型而发愁?快来迪威模型网(https://www.3dwhere.com/),一个集前沿科技与无限趣味于一体的免费3D打印宝藏平台! 踏入迪威模型网,仿佛开启一场未来科技之旅。其“3D打印”专区ÿ…...
Python VsCode DeepSeek接入
Python VsCode DeepSeek接入 创建API key 首先进入DeepSeek官网,https://www.deepseek.com/ 点击左侧“API Keys”,创建API key,输出名称为“AI” 点击“创建",将API key保存,复制在其它地方。 在VsCode中下载…...
Java中JDK、JRE,JVM之间的关系
Java中的JDK、JRE和JVM是三个核心概念,其关系可概括为JDK > JRE > JVM,具体如下: 一、定义与作用 JDK(Java Development Kit) 定义:Java开发工具包,用于开发和编译Java程序。包含内容&…...
Ubuntu22.04.6如何固定ip地址
Ubuntu22.04.6如何固定ip地址 主要参见这篇博客 ubuntu 桌面版如何设置固定IP地址_ubuntu桌面版如何修改ip-CSDN博客 1.先查看一下当前的IP是多少...
腿足机器人之十- SLAM地图如何用于运动控制
腿足机器人之十- SLAM地图如何用于运动控制 腿足机器人SLAM地图的表示与处理全局路径规划:地形感知的路径搜索基于A*的三维路径规划基于RRT*的可行步态序列生成 局部运动规划:实时步态调整与避障动态窗口法的腿足适配模型预测控制(MPC&#x…...
毕业项目推荐:基于yolov8/yolov5/yolo11的果蔬检测识别系统(python+卷积神经网络)
文章目录 概要一、整体资源介绍技术要点功能展示:功能1 支持单张图片识别功能2 支持遍历文件夹识别功能3 支持识别视频文件功能4 支持摄像头识别功能5 支持结果文件导出(xls格式)功能6 支持切换检测到的目标查看 二、数据集三、算法介绍1. YO…...
pyside6学习专栏(二):程序图像资源的加载方式
pyside6中的QLabel控件可以加载图像和gif动画,可以直接从外部文件加载,也可以从QRC类型的文件(实际是一脚本文件)经编绎生成对应的资源.PY模块文件(就是将qrc文本中指定的资源文件的16制内容写入.py文件)来使用,本文对两种方式作了一简单的示…...
vue2和vue3的按需引入的详细对比通俗易懂
以下是 Vue2 与 Vue3 按需引入的对比详解,用最简单的语言和场景说明差异: 一、按需引入的本质 目标:只打包项目中实际用到的代码(组件、API),减少最终文件体积。类比:去餐厅点餐,只…...
JAVA:Gson:序列化和反序列化
Gson 是 Google 提供的一个用于在 Java 中方便地进行 JSON 与对象互相转换的库。 Gson 并不是 Android Studio(AS)专用的库,它是一个 通用的 Java JSON 解析库,可以在 任何 Java 项目 中使用。基本用法如下: 1. 把 Ja…...
