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

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;* };*//*总体思路就是&#xff0c;对于每一个结点&…...

SIM盾构建安全底座的可行性分析

一、背景 1.1安全需求现状 在数字化时代&#xff0c;信息安全面临着日益严峻的挑战。各类网络攻击手段层出不穷&#xff0c;如数据泄露、恶意软件攻击、网络诈骗等&#xff0c;给个人、企业和社会带来了巨大的损失。为了保障信息系统的安全性&#xff0c;需要构建一个可靠的安…...

全新的Android UI框架Jetpack Compose

Jetpack Compose 概述Compose API设计原则Compose 和 View 的关系Compose预览 概述 Jetpack Compose 是Android新一代UI框架&#xff0c;采用了 声明式 的开发范式&#xff0c;基于Kotlin DSL打造&#xff0c;并且可以和现有的Android View 体系共存。 Compose API设计原则 …...

在高流量下保持WordPress网站的稳定和高效运行

随着流量的不断增加&#xff0c;网站的稳定和高效运行变得越来越重要&#xff0c;特别是使用WordPress搭建的网站。流量过高时&#xff0c;网站加载可能会变慢&#xff0c;甚至崩溃&#xff0c;直接影响用户体验和网站正常运营。因此&#xff0c;我们需要采取一些有效的措施&am…...

Cython学习笔记1:利用Cython加速Python运行速度

Cython学习笔记1&#xff1a;利用Cython加速Python运行速度 CythonCython 的核心特点&#xff1a;利用Cython加速Python运行速度1. Cython加速Python运行速度原理2. 不使用Cython3. 使用Cython加速&#xff08;1&#xff09;使用pip安装 cython 和 setuptools 库&#xff08;2&…...

Django 5实用指南(五)模板系统

Django5的模板系统是其核心功能之一&#xff0c;允许开发者将动态数据嵌入到HTML模板中&#xff0c;并根据不同的业务需求渲染页面。Django模板系统基于 Django模板语言&#xff08;DTL&#xff09;&#xff0c;它提供了一些强大的功能&#xff0c;如模板标签、过滤器、条件语句…...

基于深度学习进行呼吸音检测的详细示例

以下是一个基于深度学习进行呼吸音检测的详细示例&#xff0c;我们将使用Python语言以及一些常见的深度学习库&#xff08;如TensorFlow、Keras&#xff09;和数据处理库&#xff08;如numpy、pandas&#xff09;&#xff0c;同时会用到音频处理库librosa。整个流程包括数据加载…...

iOS 中使用 FFmpeg 进行音视频处理

在 iOS 中使用 FFmpeg 进行音视频处理,通常需要将 FFmpeg 的功能集成到项目中。由于 FFmpeg 是一个 C 库,直接在 iOS 中使用需要进行一些配置和封装。 1. 在 iOS 项目中集成 FFmpeg 方法 1:使用 FFmpeg 预编译库 下载 FFmpeg iOS 预编译库: 可以从以下项目中获取预编译的 …...

web的分离不分离:前后端分离与不分离全面分析

让我们一起走向未来 &#x1f393;作者简介&#xff1a;全栈领域优质创作者 &#x1f310;个人主页&#xff1a;百锦再新空间代码工作室 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[1504566…...

记录一个ES分词器不生效的解决过程

问题背景 商城项目,其中商品查询检索使用的是ES, 但存在某些商品查询不到的问题 例如:某商品名包含AA_BBB这样的关键词,但是搜索"AA"不能查询到该商品,但是将商品名修改为AA BBB后就能查询到了. 怀疑是分词的问题,但看代码,在创建ES索引时在对应字段上也定义了分词器…...

高性能内存对象缓存Memcached详细实验操作

目录 前提准备&#xff1a; cache1&#xff0c;2&#xff1a; 客户端cache-api&#xff08;一定得是LAMP环境&#xff09; memcache实现主主复制以及高可用(基于以上完成) cache1,2: memcachekeepalived(基于以上完成) cache1,2: 前提准备&#xff1a; 1. 准备三台cent…...

css之display:grid布局改块级元素布局

1.问题&#xff1a; div是块级元素&#xff0c;一个div元素占一行&#xff0c;但是&#xff0c;今天测试样式时&#xff0c;总是会有两个div并占一行&#xff0c;很困惑&#xff0c;结果发现是app这个样式 在main.css里 #app样式布局在main.ts里被应用 2.原因以及样式分析 im…...

高效率:转换效率高达 96%,可有效减少能源损耗

WD5030 的特点 高效率&#xff1a;转换效率高达 96%&#xff0c;可有效减少能源损耗&#xff0c;降低设备发热&#xff0c;提高能源利用效率&#xff0c;延长电池供电设备的续航时间135。 精准输出电压&#xff1a;内置可调线路补偿和可调输出电压功能&#xff0c;输出电压精度…...

推荐一个github star45k+进阶的java项目及知识的网站

mall是github上star 45k的一个java项目 mall项目是一套电商系统&#xff0c;包括前台商城系统及后台管理系统&#xff0c;基于SpringBootMyBatis实现&#xff0c;采用Docker容器化部署。 前台商城系统包含首页门户、商品推荐、商品搜索、商品展示、购物车、订单流程、会员中心…...

第2章 深入理解Thread构造函数

Thread的构造函数。 2.1 线程的命名 在构造一个Thread时可以为其命名。 2.1.1 线程的默认命名 下面构造函数中&#xff0c;并没有为线程命名。 Thread() Thread(Runnable target) Thread(ThreadGroup group, Runnable target)打开源码会看到 public Thread(Runnable targe…...

node 使用 Redis 缓存

缓存是什么&#xff1f; 高并发下&#xff0c;一个项目最先出问题的&#xff0c;并不是程序本身&#xff0c;而是数据库最先承受不住。 在数据库上我们可以做很多优化&#xff0c;例如优化 SQL 语句&#xff0c;优化索引&#xff0c;如果数据量大了&#xff0c;还可以分库、分表…...

PMBOK第7版整体架构全面详解

1. 引言 7月1日对于项目管理从业者和研究者而言&#xff0c;是个非凡意义的一个时间&#xff0c;这一天&#xff0c;翘首以待的《 项 目管理知识体系指南 》&#xff08;PMBOK&#xff09;第七版终于发布了。 总体而言&#xff0c;PMBOK第七版集百家之所长&#xff0c;成一…...

【Scrapy】Scrapy教程6——提取数据

前一小节我们拿到了页面的数据,那页面中那么多内容,我们想要其中的部分内容,该如何获取呢?这就需要对我们下载到的数据进行解析,提取出来想要的数据,这节就讲讲如何提取数据。 引入 我们编辑保存下来的shouye.html文件看下,发现这是什么鬼,全是如下图的代码。 没错…...

golang panic信息捕获

背景 我们的日志接入阿里云sls平台&#xff0c;但是&#xff0c;日志是以json的格式存储在阿里云sls平台上&#xff0c;程序中产生的error,info等日志都可以实现以json的格式打印。但是&#xff0c;golang程序中产生的panic信息本身不是以json的格式输出&#xff0c;这就导致p…...

一周学会Flask3 Python Web开发-http响应状态码

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 在Flask程序中&#xff0c;客户端发出的请求触发相应的视图函数&#xff0c;获取返回值会作为响应的主体&#xff0c;最后生成…...

goland无法debug项目

1、其实个原因是因为正在使用的Delve调试器版本太旧&#xff0c;无法兼容当前的Go语言版本1.2。Delve是Go语言的一个调试工具&#xff0c;用于提供源码级别的调试功能。Go语言每隔一段时间会发布新版本&#xff0c;而相应的调试器Delve也可能会更新以提供新的特性或修复已知问题…...

迪威模型网:免费畅享 3D 打印盛宴,科技魅力与趣味创意并存

还在为寻找优质3D打印模型而发愁&#xff1f;快来迪威模型网&#xff08;https://www.3dwhere.com/&#xff09;&#xff0c;一个集前沿科技与无限趣味于一体的免费3D打印宝藏平台&#xff01; 踏入迪威模型网&#xff0c;仿佛开启一场未来科技之旅。其“3D打印”专区&#xff…...

Python VsCode DeepSeek接入

Python VsCode DeepSeek接入 创建API key 首先进入DeepSeek官网&#xff0c;https://www.deepseek.com/ 点击左侧“API Keys”&#xff0c;创建API key&#xff0c;输出名称为“AI” 点击“创建"&#xff0c;将API key保存&#xff0c;复制在其它地方。 在VsCode中下载…...

Java中JDK、JRE,JVM之间的关系

Java中的JDK、JRE和JVM是三个核心概念&#xff0c;其关系可概括为JDK > JRE > JVM&#xff0c;具体如下&#xff1a; 一、定义与作用 JDK&#xff08;Java Development Kit&#xff09; 定义&#xff1a;Java开发工具包&#xff0c;用于开发和编译Java程序。包含内容&…...

Ubuntu22.04.6如何固定ip地址

Ubuntu22.04.6如何固定ip地址 主要参见这篇博客 ubuntu 桌面版如何设置固定IP地址_ubuntu桌面版如何修改ip-CSDN博客 1.先查看一下当前的IP是多少...

腿足机器人之十- SLAM地图如何用于运动控制

腿足机器人之十- SLAM地图如何用于运动控制 腿足机器人SLAM地图的表示与处理全局路径规划&#xff1a;地形感知的路径搜索基于A*的三维路径规划基于RRT*的可行步态序列生成 局部运动规划&#xff1a;实时步态调整与避障动态窗口法的腿足适配模型预测控制&#xff08;MPC&#x…...

毕业项目推荐:基于yolov8/yolov5/yolo11的果蔬检测识别系统(python+卷积神经网络)

文章目录 概要一、整体资源介绍技术要点功能展示&#xff1a;功能1 支持单张图片识别功能2 支持遍历文件夹识别功能3 支持识别视频文件功能4 支持摄像头识别功能5 支持结果文件导出&#xff08;xls格式&#xff09;功能6 支持切换检测到的目标查看 二、数据集三、算法介绍1. YO…...

pyside6学习专栏(二):程序图像资源的加载方式

pyside6中的QLabel控件可以加载图像和gif动画&#xff0c;可以直接从外部文件加载&#xff0c;也可以从QRC类型的文件(实际是一脚本文件)经编绎生成对应的资源.PY模块文件(就是将qrc文本中指定的资源文件的16制内容写入.py文件)来使用&#xff0c;本文对两种方式作了一简单的示…...

vue2和vue3的按需引入的详细对比通俗易懂

以下是 Vue2 与 Vue3 按需引入的对比详解&#xff0c;用最简单的语言和场景说明差异&#xff1a; 一、按需引入的本质 目标&#xff1a;只打包项目中实际用到的代码&#xff08;组件、API&#xff09;&#xff0c;减少最终文件体积。类比&#xff1a;去餐厅点餐&#xff0c;只…...

JAVA:Gson:序列化和反序列化

Gson 是 Google 提供的一个用于在 Java 中方便地进行 JSON 与对象互相转换的库。 Gson 并不是 Android Studio&#xff08;AS&#xff09;专用的库&#xff0c;它是一个 通用的 Java JSON 解析库&#xff0c;可以在 任何 Java 项目 中使用。基本用法如下&#xff1a; 1. 把 Ja…...