二叉树—leetcode
前言
本篇博客我们来仔细说一下二叉树二叉树的一些OJ题目
请看完上一篇:数据结构-二叉树-CSDN博客
💓 个人主页:普通young man-CSDN博客
⏩ 文章专栏:LeetCode_普通young man的博客-CSDN博客
若有问题 评论区见📝
🎉欢迎大家点赞👍收藏⭐文章
目录
图解:
题目及其代码
题目一
编辑
题目二
编辑
题目三
编辑
题目四
题目五
编辑
题目六
图解:
题目及其代码
题目一
965. 单值二叉树 - 力扣(LeetCode)https://leetcode.cn/problems/univalued-binary-tree/description/
如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。
只有给定的树是单值二叉树时,才返回
true
;否则返回false
。示例 1:
输入:[1,1,1,1,1,null,1] 输出:true示例 2:
输入:[2,2,2,5,2] 输出:false提示:
- 给定树的节点数范围是
[1, 100]
。- 每个节点的值都是整数,范围为
[0, 99]
。
// 函数声明:检查给定的二叉树根节点是否代表一个单值树
bool isUnivalTree(struct TreeNode* root) {// 如果根节点为空,也认为它是单值树(空树可以视为所有节点值都相同的情况)if (root == NULL)return true;// 检查左子树:如果存在左子节点,并且其值不等于根节点的值,则返回falseif (root->left && root->left->val != root->val)return false;// 检查右子树:如果存在右子节点,并且其值不等于根节点的值,则返回falseif (root->right && root->right->val != root->val)return false;// 递归检查左子树和右子树是否也都是单值树// 只有当左右子树都是单值树,并且它们的值与当前根节点的值相同时,整个树才是单值树return isUnivalTree(root->left) && isUnivalTree(root->right);
}
题目二
100. 相同的树 - 力扣(LeetCode)https://leetcode.cn/problems/same-tree/description/
给你两棵二叉树的根节点
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]
内-104 <= Node.val <= 104
bool isSameTree(struct TreeNode* p, struct TreeNode* q) {//判断是否都为NULL,注意:两个为NULL也算相等if (p == NULL && q == NULL)return true;//判断一个为NULL,一个不为NULLif(p == NULL || q == NULL )return false;//判断接节点的值是否相等,这边主要判断不相等,这样可以排除更多可能if(p->val != q->val)return false;//返回如果都为真就相等,如果有一个为假就不相等return isSameTree(p->left,q->left) && isSameTree(p->right,q->right);
}
题目三
101. 对称二叉树 - 力扣(LeetCode)https://leetcode.cn/problems/symmetric-tree/description/
给你一个二叉树的根节点
root
, 检查它是否轴对称。示例 1:
输入:root = [1,2,2,3,4,4,3] 输出:true示例 2:
输入:root = [1,2,2,null,3,null,3] 输出:false提示:
- 树中节点数目在范围
[1, 1000]
内-100 <= Node.val <= 100
bool isSameTree(struct TreeNode* p, struct TreeNode* q) {//判断是否都为NULL,注意:两个为NULL也算相等if (p == NULL && q == NULL)return true;//判断一个为NULL,一个不为NULLif(p == NULL || q == NULL )return false;//判断接节点的值是否相等,这边主要判断不相等,这样可以排除更多可能if(p->val != q->val)return false;//返回如果都为真就相等,如果有一个为假就不相等return isSameTree(p->left,q->right) && isSameTree(p->right,q->left);
}
题目四
144. 二叉树的前序遍历 - 力扣(LeetCode)https://leetcode.cn/problems/binary-tree-preorder-traversal/description/
94. 二叉树的中序遍历 - 力扣(LeetCode)https://leetcode.cn/problems/binary-tree-inorder-traversal/description/
145. 二叉树的后序遍历 - 力扣(LeetCode)https://leetcode.cn/problems/binary-tree-postorder-traversal/description/
这个三个OJ写法差不多只需要改变一点就能实现
// 前序遍历二叉树的辅助函数
// 参数:
// - root: 当前正在访问的二叉树节点指针
// - arr: 用于存储遍历结果的整型数组
// - i: 指向当前数组索引的指针,用于在遍历时追踪下一个存储位置
void Tree_preorder(struct TreeNode* root, int* arr, int* i){// 如果当前节点为空,则直接返回,结束当前递归路径if(root == NULL)return;// 将当前节点的值存入数组,并递增索引i(使用指针解引用后加法,避免了直接传值的问题)arr[(*i)++] = root->val;// 递归遍历左子树Tree_preorder(root->left, arr, i);// 递归遍历右子树Tree_preorder(root->right, arr, i);
}// 计算二叉树的节点总数
// 参数:
// - root: 二叉树的根节点指针
// 返回值:
// - 树的节点总数,空树返回0
int Treesize(struct TreeNode* root){// 递归终止条件:如果树为空,返回0return root == NULL ? 0 : // 否则,节点总数等于左子树节点数 + 右子树节点数 + 1(根节点)Treesize(root->left) + Treesize(root->right) + 1;
}// 主要函数:执行二叉树的前序遍历并返回结果数组
// 参数:
// - root: 二叉树的根节点指针
// - returnSize: 输出参数,返回数组的实际元素数量
// 返回值:
// - 存储前序遍历结果的数组指针
int* preorderTraversal(struct TreeNode* root, int* returnSize) {// 首先,计算二叉树的总节点数,用于动态数组的分配*returnSize = Treesize(root); // 通过树的节点个数,确定数组大小// 根据节点总数动态分配内存给数组arrint *arr = (int*)malloc(sizeof(int)*(*returnSize));// 初始化索引变量i为0,用于记录数组中的当前位置int i = 0;// 调用前序遍历的辅助函数填充数组Tree_preorder(root, arr, &i);// 完成遍历后,返回存储了前序遍历结果的数组return arr;
}
题目五
572. 另一棵树的子树 - 力扣(LeetCode)https://leetcode.cn/problems/subtree-of-another-tree/
给你两棵二叉树
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]
-104 <= root.val <= 104
-104 <= subRoot.val <= 104
/*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/
// 函数:判断两棵二叉树是否相同
// 参数:p 和 q 分别表示两棵树的根节点
bool isSameTree(struct TreeNode* p, struct TreeNode* q) {// 如果两棵树的当前节点都为NULL,说明已遍历完且两者结构相同,返回trueif (p == NULL && q == NULL)return true;// 如果只有一个节点为NULL,说明两棵树结构不同,返回falseif (p == NULL || q == NULL)return false;// 检查当前节点的值是否相等,如果不等则两棵树不相同,返回falseif (p->val != q->val)return false;// 递归检查左右子树是否也相同,只有都相同才返回truereturn isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
}// 函数:判断一棵树中是否存在和另一棵树相同的子树
// 参数:root 是大树的根节点,subRoot 是要查找的子树的根节点
bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot) {// 如果大树的当前节点为空,说明没有找到子树,返回falseif (root == NULL) {return false;}// 如果大树的当前节点与子树的根节点值相等,// 进一步检查以当前节点为根的子树是否与subRoot相同if (root->val == subRoot->val && isSameTree(root, subRoot)) {// 如果相同,返回truereturn true;}// 在当前节点的左子树和右子树中递归查找子树subRoot// 使用逻辑或操作,只要一边存在匹配即返回truereturn isSubtree(root->left, subRoot) || isSubtree(root->right, subRoot);
}
题目六
二叉树遍历_牛客题霸_牛客网 (nowcoder.com)https://www.nowcoder.com/practice/4b91205483694f449f94c179883c1fef?tpId=60&&tqId=29483&rp=1&ru=/activity/oj&qru=/ta/tsing-kaoyan/question-ranking
描述
编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。 例如如下的先序遍历字符串: ABC##DE#G##F### 其中“#”表示的是空格,空格字符代表空树。建立起此二叉树以后,再对二叉树进行中序遍历,输出遍历结果。
输入描述:
输入包括1行字符串,长度不超过100。
输出描述:
可能有多组测试数据,对于每组数据, 输出将输入字符串建立二叉树后中序遍历的序列,每个字符后面都有一个空格。 每个输出结果占一行。
示例1
输入:
abc##de#g##f###
输出:
c b e g d f a
#include <stdio.h>
#include <stdlib.h>// 更改基本数据类型名称为DataType以增强代码可读性
typedef char DataType;// 定义二叉树节点结构体,包含节点值(data)及左右子节点指针
typedef struct TreeNode {DataType data; // 节点存储的数据,原代码中的val改为data以增强理解struct TreeNode* left; // 左子节点指针struct TreeNode* right; // 右子节点指针
} TreeNode;// 创建二叉树的函数,接收字符串表示的树结构和当前字符索引指针
// 字符串中'#'表示空节点,其他字符表示节点值
TreeNode* CreateTree(char* p, int* pi) {// 当遇到 '#',表示当前节点为空,索引加一后返回NULLif (p[*pi] == '#') {(*pi)++;return NULL;}// 动态分配新节点内存,检查是否分配成功TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode));if (!root) { // 内存分配失败处理fprintf(stderr, "Memory allocation failed\n");exit(EXIT_FAILURE); // 程序退出}// 初始化节点值,并递增索引指向下一个字符root->data = p[(*pi)++];// 递归创建左子树和右子树root->left = CreateTree(p, pi);root->right = CreateTree(p, pi);return root; // 返回当前创建的节点
}// 中序遍历二叉树的函数,按照“左-根-右”的顺序访问每个节点
void InOrder(TreeNode* root) {if (root == NULL) return; // 遇到空节点直接返回,结束递归InOrder(root->left); // 先遍历左子树printf("%c ", root->data); // 打印当前节点值InOrder(root->right); // 最后遍历右子树
}int main() {char arr[100]; // 用于存储输入的二叉树字符串表示int i = 0; // 索引变量,用于追踪字符串中的当前字符位置// 从用户输入中读取二叉树的字符串表示scanf("%s", arr);// 根据输入字符串创建二叉树TreeNode* root = CreateTree(arr, &i);// 对创建的二叉树进行中序遍历并打印节点值InOrder(root);return 0; // 程序正常结束
}
相关文章:
二叉树—leetcode
前言 本篇博客我们来仔细说一下二叉树二叉树的一些OJ题目 请看完上一篇:数据结构-二叉树-CSDN博客 💓 个人主页:普通young man-CSDN博客 ⏩ 文章专栏:LeetCode_普通young man的博客-CSDN博客 若有问题 评论区见📝 &…...
shell编程(二)——字符串与数组
本文为shell 编程的第二篇,介绍shell中的字符串和数组相关内容。 一、字符串 shell 字符串可以用单引号 ‘’,也可以用双引号 “”,也可以不用引号。 单引号的特点 单引号里不识别变量单引号里不能出现单独的单引号(使用转义符…...
【数据结构】二叉树专题
前言 本篇博客我们来看一些二叉树的经典题型,也是对上篇博客的补充 💓 个人主页:小张同学zkf ⏩ 文章专栏:数据结构 若有问题 评论区见📝 🎉欢迎大家点赞👍收藏⭐文章 目录 1.单值二叉树 …...
开源模型应用落地-LangChain高阶-LCEL-表达式语言(四)
一、前言 尽管现在的大语言模型已经非常强大,可以解决许多问题,但在处理复杂情况时,仍然需要进行多个步骤或整合不同的流程才能达到最终的目标。然而,现在可以利用langchain来使得模型的应用变得更加直接和简单。 LCEL是什么? LCEL是一种非常灵活和强大的语言,可以帮助您更…...
Python第二语言(九、Python第一阶段实操)
目录 1. json数据格式 2. Python与json之间的数据转换 3. pyecharts模块官网 4. pyecharts快速入门(折线图) 5. pyecharts全局配置选项 5.1 set_global_ops使用 5.1.1. title_opts 5.1.2 legend_opts 5.1.3 toolbox_opts 5.1.4 visualmap_opts…...
Java异常机制
1.异常概述和异常处理机制 异常(exception)概述 异常就是程序在运行时出现的意外的,不正常的情况。 若异常产生后没有正确的处理,会导致程序的中断,程序不继续执行,以致造成损失。 2.2 异常处理机制 所以我们在开发中要一套机制来处理各种可能…...
Aws EC2,kubeadm方式安装kubernetes(k8s)
版本 docker版本:20.10.25 k8s版本(kubeadm,kubelet和kubectl):1.20.10-0 初始化 # 禁用 SELinux sudo setenforce 0 sudo sed -i s/^SELINUXenforcing$/SELINUXpermissive/ /etc/selinux/config# 关闭防火墙 sudo …...
python 比较 mysql 表结构差异
最近在做项目的时候,需要比对两个数据库的表结构差异,由于表数量比较多,人工比对的话需要大量时间,且不可复用,于是想到用 python 写一个脚本来达到诉求,下次有相同诉求的时候只需改 sql 文件名即可。 com…...
【RAG入门教程01】Langchian框架 v0.2介绍
LangChain 是一个开源框架,旨在简化使用大型语言模型 (LLM) 创建应用程序的过程。可以将其想象成一套使用高级语言工具进行搭建的乐高积木。 它对于想要构建复杂的基于语言的应用程序而又不必管理直接与语言模型交互的复杂性的开发人员特别有用。它简化了将这些模型…...
python 做成Excel并设置打印区域
记录首次用python处理Excel表格的过程。 参考文章:https://www.jianshu.com/p/5e00dc2c9f4c 程序要做的事情: 1. copy 模板文件到 output 文件夹并重命名为客户指定的文件名 2. 从 DB 查询数据并将数据写入 Excel 3. 写数据的同时, 设置每…...
SpringAI(二)
大模型:具有大规模参数和复杂计算结构的机器学习模型.通常由深度神经网络构建而成,拥有数十亿甚至数千亿个参数.其设计目的在于提高模型的表达能力和预测性能,应对复杂的任务和数据. SpringAI是一个AI工程领域的应用程序框架 大概推出时间是2023年7月份(不确定) 目的是将S…...
小白都可以通过U盘重装系统,再也不用花50块钱去安装系统啦
下载Ventoy 软件 1、今天带着大家通过Ventoy 安装Windows 11 系统。 2、首先我们通过官网如下地址:https://www.ventoy.net/cn/,找到我们对应系统的Ventoy 软件安装包。 3、通过官网可以找到软件包的地址地址,如下图所示。 4、如下就是我下…...
android 双屏异显-学习笔记
双屏异显 日常生活中,有时候会遇到 Android 设备连接两个屏幕进行显示的问题,比如酒店登记信息时,一个屏幕用于员工操作,一个屏幕显示相关信息供顾客查看。这里就涉及到 Android 的双屏异显的问题,实现Android 的双屏异显,Google 也提供了相应的 API方法 Presentation。…...
Android Lottie 体积优化实践:从 6.4 MB 降到 530 KB
一、说明 产品提出需求:用户有 8 个等级,每个等级对应一个奖牌动画。 按照常用的实现方式: 设计提供 8 个 lottie 动画(8 个 json 文件)。研发将 json 文件打包进入 APK 中。根据不同等级播放指定的动画。 每一个 …...
Django前端页面-模板继承
通过模板的继承,可以将所有共同的前端页面移到母版,那么其他页面就可以用到母版了。 这是母版 <!DOCTYPE html> <html><head>{% block css %}{% endblock %}</head><body><h1>母版</h1><div><!-- …...
使用HTML、CSS和JavaScript编写一个注册界面(一)
倘若文章或代码中有任何错误或疑惑,欢迎提出交流哦~ HTML和CSS 首先,我们需要编写一个简洁的注册界面。 简单编写下,如下: 呈现效果为: <!DOCTYPE html> <html lang"en"><head><me…...
什么是档案数字化管理
档案数字化管理指的是将传统的纸质档案转换为数字形式,并通过电子设备、软件和网络技术进行管理和存储的过程。 档案数字化管理包括以下几个步骤: 1. 扫描和数字化:将纸质档案通过扫描仪转换为数字图像或文档。可以使用OCR(光学字…...
vuInhub靶场实战系列--prime:1
免责声明 本文档仅供学习和研究使用,请勿使用文中的技术源码用于非法用途,任何人造成的任何负面影响,与本人无关。 目录 免责声明前言一、环境配置1.1 靶场信息1.2 靶场配置 二、信息收集2.1 主机发现2.1.1 netdiscover2.1.2 nmap主机扫描2.1.3 arp-scan主机扫描 2.2 端口扫描…...
L48---1637. 两点之间不包含任何点的最宽垂直区域(排序)---Java版
1.题目描述 2.思路 (1)返回两点之间内部不包含任何点的 最宽垂直区域 的宽度。 我的理解是相邻两个点,按照等差数列那样,后一个数减去相邻的前一个数,才能保证两数之间不含其他数字。 (2)所以&…...
在线渲染3d怎么用?3d快速渲染步骤设置
在线渲染3D模型是一种高效的技术,它允许艺术家和设计师通过互联网访问远程服务器的强大计算能力,从而加速渲染过程。无论是复杂的场景还是高质量的视觉效果,在线渲染服务都能帮助您节省宝贵的时间。 在线渲染3D一般选择的是:云渲染…...
《软件定义安全》之二:SDN/NFV环境中的安全问题
第2章 SDN/NFV环境中的安全问题 1.架构安全 SDN强调了控制平面的集中化,从架构上颠覆了原有的网络管理,所以SDN的架构安全就是首先要解决的问题。例如,SDN实现中网络控制器相关的安全问题。 1.1 SDN架构的安全综述 从网络安全的角度&…...
Qt图表类介绍
本文主要介绍QCharts相关的模块及类。 Qt中图表模块有以下几种类型:折线图,样条曲线图,面积图,散点图,条形图,饼图,方块胡须图,蜡烛图,极坐标图。 QCharts的图表框架类似…...
时隔很久运行苍穹外卖项目,出现很多错误
中途运行了很多其他项目,maven的配置文件还被我修改了一次。导致再次运行苍穹外卖项目出现很多错误。 发现没有办法,把本地的仓库删了个干干净净。然后点击clean发现报错: Cannot access alimaven (http://mavejavascript:void(0);n.aliyun.…...
补篇协程:协程(Coroutine)里通过挂起suspend函数实现异步IO操作
异步IO的概念 异步IO是一种非阻塞的数据读写方法,异步IO与同步IO相对。 当一个异步过程调用发出后,调用者不能立刻得到结果。 实际的IO处理部件在完成操作后,会通过状态、通知或回调机制来通知调用者。 在一个CPU密集型的应用中,…...
qmt量化交易策略小白学习笔记第16期【qmt编程之获取北向南向资金(沪港通,深港通和港股通)】
qmt编程之获取北向南向资金 qmt更加详细的教程方法,会持续慢慢梳理。 也可找寻博主的历史文章,搜索关键词查看解决方案 ! 北向南向资金(沪港通,深港通和港股通) #北向南向资金交易日历 获取交易日列表…...
开源项目学习——vnote
一、介绍 vnote是一款免费且开源的markdown编辑器,用C开发,基于Qt框架,windows/linux/mac都能用。 二、编译 $ git clone --recursive https://github.com/vnotex/vnote.git $ cd vnote && mkdir build $ cd build $ cmake ../ $ …...
5_1 Linux 计划任务
5_1 Linux 计划任务 文章目录 5_1 Linux 计划任务[toc]1. crontab 命令2. 计划任务书写格式 用途:按照设置的时间间隔,为用户反复执行某一固定的系统任务 软件包:cronie、crontabs 系统服务:crond 日志文件:/var/log/c…...
接口框架项目实战-pytest(六)csv数据驱动
csv 数据驱动 为了解决数据量大 导致yaml文件重复太多 yaml_util.py import osimport jsonpath import yamlfrom pytestdemo.common.base_util import get_path from pytestdemo.common.csv_util import analysis_parametersdef read_config_file(one_node,two_node):with ope…...
【Apache Doris】周FAQ集锦:第 5 期
【Apache Doris】周FAQ集锦:第 5 期 SQL问题数据操作问题运维常见问题其它问题关于社区 欢迎查阅本周的 Apache Doris 社区 FAQ 栏目! 在这个栏目中,每周将筛选社区反馈的热门问题和话题,重点回答并进行深入探讨。旨在为广大用户和…...
再读高考作文题
新课标I卷:讨论了随着互联网和人工智能的普及,问题是否会变得越来越少,要求考生写一篇文章,表达自己对于这一现象的联想和思考。 从来就没有什么救世主 AI也不是 一直不会写作文,直到高中,才堪堪…...
公司做网站都咨询哪些问题/百度游戏中心
因为如果函数是一个新概念,那么我之前的评论可能有点难以理解。在我个人认为解决这个问题最好的方法是将相关代码包装在一个对象中。在Python在很大程度上基于对象的概念,可以将对象看作是使用对数据进行操作的函数对数据进行分组。一个对象可以表示一个…...
xydown wordpress/免费推广引流平台推荐
玩懂手机网资讯,如果你是一名代码爱好者,自由开源爱好者,你可能非常熟悉GitHub,在国内大部分用户和企业更喜欢使用码云Gitee,很多企业和个人的项目都放置在码云Gitee上面,进行协作开发,对于大部…...
佛山设计论坛/优化设计七年级上册语文答案
Node.getTextContent()是org.w3c.dom.Node下面的方法,这个包是JDK自带的,这所以会出现getTextContent找不到是因为jar包的冲突,是由xml-api.jar这个包的冲突引起的。我的工程里没有使用xml-api.jar,查了下包依赖,是xal…...
东莞手机网站制作/今日头条新闻最新消息
有一批价格分别为p1,p2, p3 … pn的n种商品, 你手中持有金钱为money,如何购买商品使剩余的钱最少,求最少剩多少? 示例一: 输入 p[150, 200, 350], money 250 输出:50 示例二: 输入…...
哪个网站买东西是正品又便宜/百度推广公司怎么代理到的
项目包含的功能脚本:login.php//登录reg.php//注册用户user_add.php//注册校验脚本user_login_check.php//登录校验脚本image.php//验证码图片生成脚本流程:设计数据库:包含用户uid,用户名,密码,昵称&#…...
wordpress评论不显示头像/网络营销核心要素
1.7 Linux Control groups Linux Cgroups的全称是Linux Control Groups,是Linux内核的一个功能.最早是由Google的工程师(主要是Paul Menage和Rohit Seth)在2006年发起,最早的名称为进程容器(process containers)。在2007年时,因为在Linux内核中,容器(container)这个名…...