★ OJ题 ★ 二叉树

news2024/11/17 23:47:11

Ciallo~(∠・ω< )⌒☆ ~ 今天,我将和大家一起做一些二叉树的OJ题~ 

目录

一  单值二叉树

二  相同的树

三  对称二叉树

四  二叉树的前序遍历

五  另一颗树的子树

六  二叉树遍历


一  单值二叉树

965. 单值二叉树 - 力扣(LeetCode)

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

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

此题建议用递归方法:

bool isUnivalTree(struct TreeNode* root) 
{
    // 如果当前节点为空,根据定义,空树可以被认为是单值树
    if(root == NULL)
        return true;
    // 检查左子节点是否存在且值是否与根节点相同
    if(root->left && root->left->val != root->val)
        return false;
    // 检查右子节点是否存在且值是否与根节点相同
    if(root->right && root->right->val != root->val)
        return false;
    // 递归地检查左子树和右子树是否都是单值树
    // 这里要求左子树和右子树中的所有节点值都必须与根节点的值相同
    return isUnivalTree(root->left) && isUnivalTree(root->right);
}

如果当前节点(root)为空,则根据单值树的定义,空树可以被认为是单值树,因此返回true。
检查子节点值:
如果左子节点存在且其值与根节点不同,则不满足单值树的定义,返回false。
如果右子节点存在且其值与根节点不同,同样不满足单值树的定义,返回false。
递归检查:如果左子节点和右子节点都满足条件(即要么不存在,要么值与根节点相同),则递归地对左子树和右子树调用isUnivalTree函数,确保这两棵子树也都是单值树。只有当左子树和右子树都是单值树时,才返回true;否则,返回false。

二  相同的树

100. 相同的树 - 力扣(LeetCode)

要求:给你两棵二叉树的根节点 p 和 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);
}

这个函数通过递归的方式检查两棵树是否完全相同。首先,它检查两个节点是否都为空(即都是叶子节点的下一个位置),如果是,则返回true。然后,它检查是否只有一个节点为空(即一棵树比另一棵树短),如果是,则返回false。接下来,它比较两个节点的值是否相等,如果不等,则返回false。最后,如果两个节点的值相等,则递归地调用isSameTree函数来检查它们的左子树和右子树是否也相同。如果所有子树都相同,则返回true;否则,返回false。

三  对称二叉树

101. 对称二叉树 - 力扣(LeetCode)

要求:给你一个二叉树的根节点 root , 检查它是否轴对称。

bool _isSymmetric(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 _isSymmetric(p->left, q->right) && _isSymmetric(p->right, q->left);
}

bool isSymmetric(struct TreeNode* root) 
{
    return _isSymmetric(root->left, root->right);
}

主要方法同上题一样,通过递归的方式检查两棵树是否是对称二叉树。

如果两个节点都为空,那么它们是对称的(因为空树和空树总是对称的)。
如果只有一个节点为空,或者两个节点的值不相等,那么它们不对称
如果两个节点都不为空且值相等,那么递归地检查:

  • 第一个节点的左子树和第二个节点的右子树是否对称。
  • 第一个节点的右子树和第二个节点的左子树是否对称。

如果这两对子树都对称,那么这两棵树就是对称的。
然后,isSymmetric函数是调用_isSymmetric的入口点,它检查根节点的左子树和右子树是否对称

四  二叉树的前序遍历

144. 二叉树的前序遍历 - 力扣(LeetCode)

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

int TreeSize(struct TreeNode* root)
{
    return root == NULL ? 0 : TreeSize(root->left) + TreeSize(root->right) + 1;
}
void preorder(struct TreeNode* root, int* a,int* pi)
{
    if(root == NULL)
    {
        return;
    }
    a[(*pi)++] = root->val;
    preorder(root->left, a, pi);
    preorder(root->right, a, pi);
}
int* preorderTraversal(struct TreeNode* root, int* returnSize)
{
    *returnSize = TreeSize(root);
    int* a = (int*)malloc(sizeof(int) * (*returnSize));
    int i = 0;
    preorder(root, a, &i);
    return a;
}

首先,TreeSize 函数通过递归计算了二叉树中节点的总数,这是为了提前分配足够的内存空间来存储前序遍历的结果。
然后,preorder 函数是一个递归函数,用于实际执行前序遍历。它首先检查当前节点是否为空,如果不为空,就将当前节点的值存入数组 a 中,并更新索引 pi。接着,它递归地对左子树和右子树进行前序遍历。注意:若形参不使用地址pi,在递归的过程中i的值会遗失。
最后,preorderTraversal 函数是外部调用的接口,它首先通过 TreeSize 函数获取树的大小,然后分配足够的内存空间,并调用 preorder 函数来填充这个数组。最后,它返回这个数组和数组的大小。

 

五  另一颗树的子树

572. 另一棵树的子树 - 力扣(LeetCode)

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(root->val == subRoot->val && isSameTree(root, subRoot))
        return true;
    return isSubtree(root->left, subRoot) || isSubtree(root->right, subRoot);
}

核心:找出root所有子树,和subRoot比较 

isSameTree 函数:用来判断两棵树p和q是否完全相同的。(复用第二题)
isSubtree 函数:用来判断一棵树subRoot是否是另一棵树root的子树。
如果root是空树,那么subRoot肯定不是它的子树,返回false。
如果root和subRoot的根节点值相同,并且它们的结构也完全相同(即isSameTree(root, subRoot)返回true),那么subRoot就是root的子树(实际上是相同的树),返回true。
如果上面的条件都不满足,那么就递归地在root的左子树和右子树中查找是否存在与subRoot相同的子树。如果左子树中存在,或者右子树中存在,那么返回true;如果两者都不存在,那么返回false。

六  二叉树遍历

二叉树遍历_牛客题霸_牛客网 (nowcoder.com)

#include <stdio.h>
#include <stdlib.h>
typedef struct BinTreeNode
{
    struct BinTreeNode* left;
    struct BinTreeNode* right;
    char val;
}BTNode;

BTNode* CreateTree(char* a,int* pi)
{
    if(a[*pi] == '#')
    {
        (*pi)++;
        return NULL;
    }
    BTNode* root = (BTNode*)malloc(sizeof(BTNode));
    root->val = a[(*pi)++];
    root->left = CreateTree(a, pi);
    root->right = CreateTree(a, pi);
    return root;
}
void InOrder(BTNode* root)
{
	if (root == NULL)
	{
		return;
	}
	InOrder(root->left);
	printf("%c ", root->val);
	InOrder(root->right);
}
int main()
{
    char a[100];
    scanf("%s", a);
    int i = 0;
    BTNode* root = CreateTree(a, &i);
    InOrder(root);
    return 0;
}

此题为IO题,需要进行接收打印。

CreateTree函数根据给定的前序遍历字符串a和一个指向当前处理位置的指针pi来构建二叉树。当遇到#字符时,表示当前位置为空节点,函数返回NULL。否则,创建一个新节点,设置其值为当前字符,并递归地构建其左右子树。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2075858.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android平台原生音视频编解码MediaCodec

MediaCodec介绍 MediaCodec是Android平台上的一个多媒体编解码器&#xff0c;它可以用于对音频和视频进行编解码。通过MediaCodec&#xff0c;开发者可以直接访问底层的编解码器&#xff0c;实现更高效的音视频处理。同时&#xff0c;MediaCodec也支持硬件加速&#xff0c;可以…

java中的Opencv:Opencv简介与开发环境部署

文章目录 1.Opencv简介Opencv的应用 2.Java使用OpenCV进行图像操作opencv安装java项目中集成Opencv 3.Opencv常用的API 1.Opencv简介 OpenCV &#xff08; Open Source Computer Vision Library &#xff09;是一个广泛应用于计算机视觉和图像处理领域的开源库。它提供了丰富的…

Android12上调试nxp的wifi模块支持5G频段的ap和sta同时共存

我们使用的是nxp的88W8987模块 在使用过程中发现,不能分享出5g的热点,通过log发现国家码没有正常设置,驱动那边加载相关数据库失败 通过与供应商和度娘等排查,需要下载regulatory.db,进行insmod加载才可以,rk默认没有处理,因为rk默认适配的博通的模块,自带了国家码相关…

SAP DYNP_VALUES_UPDATE/READ 更新/获取屏幕字段函数用法

【函数】Function DYNP_VALUES_READ, DYNP_VALUES_UPDATE 【作用】实时获取和更新屏幕上的最新值。 【场景】GUI选择屏幕&#xff0c;选择公司代码&#xff0c;过滤所属公司下的项目&#xff1b;选择项目过滤所属的分期。 REPORT zdynp_values_read MESSAGE-ID 00 NO STANDAR…

grbl下载、编译与修改

一、下载 官方基本grbl https://github.com/grbl/grbl官方优化后的grbl https://github.com/gnea/grbl官方适配mega2560的grbl https://github.com/gnea/grbl-Mega/ 二、编译 arduino最新 为了防止出现问题&#xff0c;将arduino更新到最新是必要的。压缩和加载库 压缩&…

文件上传不断流,下载不限速的企业网盘推荐——可道云teamOS

在信息爆炸的时代&#xff0c;企业文件的传输与管理成为了日常工作中不可或缺的一环。面对海量数据的传输需求&#xff0c;如何确保文件上传的流畅性、下载的高效性&#xff0c;同时又能兼顾文件管理的便捷性&#xff0c;成为了许多企业面临的难题。 今天&#xff0c;我要向大…

20240823 system()读取io口状态 popen()接收io操作的返回信息

读取工控机io system 与 popen io操作APIc system&#xff08;&#xff09;popenopen os.system()、os.popen()和subprocess的区别&#xff08;一&#xff09; 函数system 直接读文件最快&#xff01;[Linux] Ubuntu实机下控制GPIO io操作API 工控机的io口操作的函数 需要…

【机器学习】CNN在计算机视觉中的应用

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 CNN在计算机视觉中的应用1. 引言2. 图像分类3. 目标检测3.1 基于区域的目标检测…

总结拓展八:SAP常见的系统间接口方式

&#xff08;01&#xff09;-远程函数调用 所谓系统接口&#xff0c;实际上就是不同系统间的数据交换方式。 对于一个企业来说&#xff0c;肯定不是一个系统就能够支持所有业务的运转&#xff0c;几乎所有企业都会使用多个系统&#xff0c;比如较为常见的ERP/MES等。 当企业有多…

【STM32单片机_(HAL库)】3-4-4【中断EXTI】【智能排队控制系统】项目实现

3-4-2系统框图及硬件接线 3-4-3系统代码框架搭建 4.软件—tasks.c文件编写 排队控制系统状态机 tasks.c #include "tasks.h" #include "led.h" #include "beep.h" #include "exti.h" #include "lcd1602.h" #include &…

直流负载的必要性

直流负载在电力系统中扮演着至关重要的角色&#xff0c;它的必要性主要体现在以下几个方面&#xff1a; 1. 能源转换效率&#xff1a;在现代电力系统中&#xff0c;电能的生成、传输和使用过程中&#xff0c;需要经过多次能量形式的转换。在这个过程中&#xff0c;直流负载可以…

虚幻引擎UE5入坑记

前言 Unreal Engine 和Unity Engine作为目前主流的游戏引擎&#xff0c;各有优缺点。而我目前的工作还是以Unity开发为主&#xff0c;在使用Unity的过程中&#xff0c;总避免不了听到或看到过UE相关的东西&#xff0c;从开始的好奇到后面想要去学习它&#xff0c;但是&#xf…

数据结构之AVL树的 “奥秘“

二叉树查询性能分析&#xff1a; 插入和删除操作都必须先查找&#xff0c;查找效率代表了二叉搜索树中各个操作的性能 对有n个结点的二叉搜索树&#xff0c;若每个元素查找的概率相等&#xff0c;则二叉搜索在二叉搜索树树平均查找长度是结点的深度的函数&#xff0c;即结点越深…

继电器的工作原理及作用

系列文章目录 1.元件基础 2.电路设计 3.PCB设计 4.元件焊接 5.板子调试 6.程序设计 7.算法学习 8.编写exe 9.检测标准 10.项目举例 11.职业规划 文章目录 前言1.基本概念3.主要作用4.基本结构5.工作原理 前言 送给大学毕业后找不到奋斗方向的你&#xff08;每周不定时更新&…

联合贷款系统架构与流程解析

在联合贷款作为一种创新的融资模式&#xff0c;正逐渐受到越来越多金融机构和借款人的青睐。本文将分析联合贷款产品的优势&#xff0c;详细描述其流程&#xff0c;并结合实际案例展示联合贷款在实际应用中的场景。帮助读者增进对于联合贷款系统架构及其运作机制的了解。 一、…

600条最强 Linux 命令总结(非常详细)零基础入门到精通,收藏这一篇就够了

一、基本命令 uname -m 显示机器的处理器架构 uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统部件 (SMBIOS / DMI) hdparm -i /dev/hda 罗列一个磁盘的架构特性 hdparm -tT /dev/sda 在磁盘上执行测试性读取操作系统信息 arch 显示机器的处理器架构 uname -…

UE5 UMG UI编辑器工作流

创建UI控件 1.在内容菜单&#xff08;Content Browser&#xff09;面板&#xff0c;点击添加&#xff08;Add&#xff09;或者右键空白处&#xff0c;依次选择用户界面&#xff08;User Interface&#xff09;/ 控件蓝图&#xff08;Widget Blueprint&#xff09;。 2.在弹出…

领域驱动模型设计与微服务架构落地(四)之DDD分层架构设计

那么聊完领域模型之后,其实我们会发现,接下来,很多的程序员可能就会直接上代码,因为很多的程序员觉得这个你的战略设计跟我们落地的代码没有关系。哪怕你可能说得天花乱坠,可是做为底层的开发人员,我只关心手头上的功能有没有实现,实现完成之后有没有BUG。 那么我们该如…

全网最详细的自动化测试

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 软件测试作为软件生命周期中不可缺少的组成部分&#xff0c;对提高软件质量起着重要作用。随着软件测试的发展&#xff0c;自动化测试技术也得到了很大提高。 …

CART算法:决策树的双面剑

一 引言 上一篇文章 决策树算法&#xff1a;ID3与C4.5的对比分析 中介绍了ID3和C4.5两种决策树算法&#xff0c;这两种决策树都只能用于分类问题&#xff0c;而CART&#xff08;classification and regression tree&#xff09;决策树算法它可以处理分类问题&#xff08;Class…