二叉树经典OJ题分析

news2024/9/22 15:33:22

目录

一、单值二叉树

1.1 题目

1.2 思路

1.3 C语言题解

二、相同的树

2.1 题目

2.2 思路

2.3 C语言题解

三、对称二叉树

3.1 题目

3.2 思路

3.3 C语言题解

四、另一颗树的子树

4.1 题目

4.2 思路

4.3 C语言题解

五、翻转二叉树

5.1 题目

5.2 思路

5.3 C语言题解

六、平衡二叉树

6.1 题目

6.2 思路

6.3 C语言题解


一、单值二叉树

1.1 题目

LeetCode原题链接:. - 力扣(LeetCode)

1.2 思路

通过递归判断每个根节点的值是否与左右子树的值相等

1.3 C语言题解

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);
}

二、相同的树

2.1 题目

LeetCode原题链接:. - 力扣(LeetCode)

2.2 思路

  • 考虑特殊情况:
  1. 如果有两个树的同一个子树中一个为空,一个不为空,则一定不相同。
  2. 如果有两个树的同一个子树中都为空,则一定相同。
  3. 如果有两个树的同一个子树中都不为空,则需要比较对应的值。
  • 考虑一般情况:
  1. 每一个结点都可以是一棵树的根节点,重复递归解决问题

2.3 C语言题解

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);
}

三、对称二叉树

3.1 题目

LeetCode原题链接:. - 力扣(LeetCode)

3.2 思路

本质上就是左右子树的比较,类似于第二题。唯一的不同是,左子树需要与右子树比较,右子树需要与左子树比较。

3.3 C语言题解

//直接复制代码,修改左右子树逻辑
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->right) && isSameTree(p->right,q->left);
}
//传给函数左右两棵子树
bool isSymmetric(struct TreeNode* root) 
{
    return isSameTree(root->left,root->right);
}

四、另一颗树的子树

4.1 题目

LeetCode原题链接:. - 力扣(LeetCode)

4.2 思路

根据题意,要找出原树的所有的子树与给定的树进行比较,若相同则为另一棵树的子树。

这其中涉及了两个问题

  • 比较两棵树是否是同一棵树,与题目二的思路一样,直接复制即可
  • 如何解决原树的遍历问题?
  1. 考虑特殊情况:当遍历到的根节点的值正好等于所给树的根节点就开始比较逻辑
  2. 考虑一般情况:类似于遍历的逻辑,找到所要找的结点。

ps:左右子树找到一个就行,所以递归执行的是逻辑!!

4.3 C语言题解

//直接复制代码
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);
}

五、翻转二叉树

5.1 题目

LeetCode原题链接:. - 力扣(LeetCode)

5.2 思路

  1. 考虑特殊情况:
    如果树仅有叶子结点,直接交换即可
  2. 考虑一般情况:
    每个子树都交换后,直接交换两棵子树就可以实现翻转

ps:由于递归创建的栈帧彼此互不影响,所以需要保存左右结点再进行交换。

5.3 C语言题解

struct TreeNode* invertTree(struct TreeNode* root) {
    if (root == NULL) 
    {
        return NULL;
    }
    //保存叶子结点
    struct TreeNode* left = invertTree(root->left);
    struct TreeNode* right = invertTree(root->right);
    //交换
    root->left = right;
    root->right = left;
    return root;
}

六、平衡二叉树

6.1 题目

LeetCode原题链接:. - 力扣(LeetCode)

ps:平衡二叉树是一种二叉树,它的任何节点的两棵子树的高度差不大于1

6.2 思路

根据定义,一棵二叉树是平衡二叉树,当且仅当其所有子树也都是平衡二叉树,所以如果采取通过判断左右两颗子树的高度求差的做法会忽略了子树不是平衡二叉树的情况。此题依然采取递归的做法:求解高度 + 遍历所有子树

求解高度的源码详解请见博主的另一篇博客:http://t.csdnimg.cn/QRJlX

6.3 C语言题解

//直接复制求高度的代码
int TreeHeight(struct TreeNode* root)
{
	if (root == NULL)
	{
		return 0;
	}
	int leftHeight = TreeHeight(root->left);
	int rightHeight = TreeHeight(root->right);
 
	return leftHeight > rightHeight ?
		leftHeight + 1 : rightHeight + 1;
}

bool isBalanced(struct TreeNode* root) {
    if(root==NULL)
    {
        return true;
    }
    else
    {
        return abs(TreeHeight(root->left) - TreeHeight(root->right)) <= 1 && isBalanced(root->left) && isBalanced(root->right);
    }
}

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

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

相关文章

Elasticsearch之文本分析

文本分析基本概念 官网&#xff1a;Text analysis | Elasticsearch Guide [7.17] | Elastic 官网称为文本分析&#xff0c;这是对文本进行一直分析处理的方式&#xff0c;基本处理逻辑是为按照预先制定的分词规则&#xff0c;把原本的文档进行分割成多个小颗粒度的词项&#x…

800HZ电源-高频电源行业的明星

一、800Hz电源的简介&#xff1a; 800Hz电源&#xff0c;顾名思义&#xff0c;是一种专为满足通信系统中特定频率要求而设计的电源。通常&#xff0c;800Hz电源具有极高的稳定性和精确度&#xff0c;能提供稳定的电压输出&#xff0c;确保通信设备如交换机、基站、无线路由器等…

动手学操作系统(一、搭建实验环境)

动手学操作系统&#xff08;一、搭建实验环境&#xff09; 文章目录 动手学操作系统&#xff08;一、搭建实验环境&#xff09;1. 在VMware虚拟机中安装ubuntu20.042. 安装Bochs3. 启动计算机Reference &#x1f680; 环境配置 &#x1f680; 笔者的环境使用的是 ubuntu 20.04…

计算机图形学入门Games101笔记01:Overview of Computer Graphics

第一章讲述了计算机图形学是什么和GAMES101会讲什么 1.What is Computer Graphics? The use of computers to synthesize and manipulate visual information. 图形学是合成和操纵视觉信息的计算机应用。 百度百科&#xff1a;计算机图形学(Computer Graphics&#xff0c;简…

从零开始:如何集成美颜SDK和优化美颜接口

今天&#xff0c;小编将从零开始&#xff0c;详细讲解如何集成SDK并优化美颜接口。 一、选择合适的美颜SDK 评估SDK的功能 在评估过程中&#xff0c;可以通过阅读官方文档、查看示例代码以及实际测试来确定SDK是否符合需求。 兼容性和性能 确保其支持你开发的应用平台&…

开发多个工具包的黑产团伙GXC正在积极拥抱AI技术

研究人员发现一个名为 GXC Team 的犯罪团伙&#xff0c;该团伙专门开发用于网上银行盗窃、电子商务欺诈与互联网诈骗的工具。2023 年 11 月 11 日&#xff0c;该组织以别名 googleXcoder 在暗网上发布多项公告。开始售卖新开发的结合人工智能的工具&#xff0c;用于创建用于电汇…

【必备工具】gitee上传-保姆级教程

目录 1.gitee是什么 2.gitee怎么注册 ​编辑 3.gitee怎么提交代码 4.gitee的三板斧 Clone仓库 Q&A 1. Gitee 只有三板斧吗&#xff1f; 2. Git 教了&#xff0c;Gitee 上没有绿点怎么办&#xff1f; 3. 用户名和密码输入错误怎么办&#xff1f; 4. 操作时不小心…

0成本的副业兼职,咸鱼监督打卡,新手小白也能一天100+

这两天在咸鱼上闲逛&#xff0c;看到有个项目很有意思&#xff0c;监督别人打卡赚服务费&#xff0c;每天轻松收入100。 周周近财&#xff1a;让网络小白少花冤枉钱&#xff0c;赚取第一桶金 这种监督打卡服务并非新颖的商业模式&#xff0c;实际上在很久以前&#xff0c;许多…

美业SaaS收银系统源码-已过期卡项需要延期怎么操作?美业系统实操

美业SaaS系统 连锁多门店美业收银系统源码 多门店管理 / 会员管理 / 预约管理 / 排班管理 / 商品管理 / 促销活动 PC管理后台、手机APP、iPad APP、微信小程序 1.询问会员手机号和需要延期的卡项 2.PC运营后端-数据导入-修改已售卡项&#xff0c;搜索手机号 3.把需要卡项选…

Oracle 序列-SEQUENCE

文章目录 序列-SEQUENCE创建序列访问序列序列的修改和删除查询序列信息 序列-SEQUENCE 创建序列 访问序列 序列的修改和删除 DROP SEQUENCE SEQ_EKPO;查询序列信息 可以通过视图 dba/all/user_sequences 查询序列的相关信息 SELECT SEQUENCE_NAME FROM DBA_SEQUENCES WHERE …

穿越时空的工厂之旅:探索可视化三维场景的奥秘

在科技日新月异的今天&#xff0c;我们似乎总是在不断追求着更加高效、智能的生产方式。 传统的工厂管理方式往往依赖于平面图纸、纸质文档和现场巡查&#xff0c;这不仅效率低下&#xff0c;而且容易出错。而三维可视化技术通过3D建模和虚拟现实技术&#xff0c;将工厂内部的各…

[企业级高效系统工具]短视频矩阵系统 ,一站式管理新媒体账号,短视频精准获客,一键管理上千个短视频账。

一、做项目为什么要搭建一款属于自己的系统&#xff1f; 在讲这个短视频矩阵系统前&#xff0c;我们聊聊做项目的时候为什么要搭建一款属于自己的系统。 1.拥有自己的系统&#xff0c;就意味着你可以随时随地进行源码部署和更新。你的项目就能紧跟时代潮流&#xff0c;始终保持…

嵌入式进阶——RTC时钟

&#x1f3ac; 秋野酱&#xff1a;《个人主页》 &#x1f525; 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 RTC时钟原理图PCF8563寄存器控制与状态寄存器 设备地址I2C环境初始化RTC寄存器数据读取RTC寄存器数据写入RTC闹钟设置RTC定时器设置…

Linux 使用 yum安装 ELK服务,yum 安装elasticsearch和Kibana(未写完)

文章目录 环境准备ELK组件介绍安装Elasticsearch安装Kibana 丢弃下载ELK 服务安装包Elasticsearch安装 Tips:关闭elasticsearch https 环境准备 ELK组件介绍 ElasticSearch &#xff1a; 是一个近实时&#xff08;NRT&#xff09;的分布式搜索和分析引擎&#xff0c;它可以用…

学术图表的基本配色方法

不论是商业图表还是专业图表&#xff0c;图表的配色都极其关键。图表配色主要有彩色和黑白两种配色方案。刘万祥老师曾提出&#xff1a; “在我看来&#xff0c;普通图表与专业图表的差别&#xff0c;很大程度就体现在颜色运用上。” 对于科学图表&#xff0c;大部分国内的期…

【Unity之FGUI】黑神章Fairy GUI控件详解

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;就业…

【MATLAB】基于VMD-SSA-GRU的回归预测模型

有意向获取代码&#xff0c;请转文末观看代码获取方式~ 1 基本定义 基于VMD-SSA-GRU的回归预测模型是一种集成了变分模态分解&#xff08;VMD&#xff09;、同步滑动平均&#xff08;SSA&#xff09;和门控循环单元&#xff08;GRU&#xff09;的复杂时间序列预测方法。下面将…

SaaS产品如何借助分销裂变实现爆发式增长?

在SaaS市场中&#xff0c;如何通过有效的推广方式实现产品的快速增长是每个企业都在思考的问题。分销裂变作为一种新兴的推广方式&#xff0c;以其低成本、高效率的特点&#xff0c;为SaaS产品的增长提供了新的可能。 一、分销裂变的基本原理 分销裂变是通过设置一定的奖励机…

一招搞定!家里灰尘多?教你如何轻松清理,推荐必备神器

在现代生活中&#xff0c;灰尘无处不在&#xff0c;特别是在大城市&#xff0c;空气中的污染物更多&#xff0c;导致家里的灰尘积聚速度加快。保持家居环境的干净和整洁不仅能提升生活质量&#xff0c;还能保护我们的健康。作为一名家电博主将为你提供详细的家里灰尘清理方法&a…

抖音里卖什么最赚钱?4个冷门的高利润商品,还有谁不知道!

哈喽~我的电商月月 做抖音小店的新手朋友&#xff0c;一定很想知道&#xff0c;在抖音里卖什么最赚钱&#xff1f; 很多人都会推荐&#xff0c;日常百货&#xff0c;小风扇&#xff0c;女装&#xff0c;宠物用品等等&#xff0c;这些商品确实很好做&#xff0c;你们可以试试 …