【LeetCode】——链式二叉树经典OJ题详解

 =========================================================================

主页点击直达:个人主页

我的小仓库:代码仓库

C语言偷着笑:C语言专栏

数据结构挨打小记:初阶数据结构专栏

Linux被操作记:Linux专栏

LeetCode刷题掉发记:LeetCode刷题

算法头疼记:算法专栏 

=========================================================================

目录

前言:

LeetCode 965.单值二叉树

LeetCode 100.相同的树

LeetCode 101.对称二叉树

LeetCode 144 145 94 .二叉树的前、中、后序遍历

LeetCode 572.另一棵树的子树


前言:

在之前的文章讲解了二叉树的链式结构的实现以及前、中、后序的遍历。不知道大家看完后有没有理解和有所收获,今天基于那篇文章给大家分享讲解几道经典的题目,更便于大家的理解和深入。

二叉树的题目一定要会两个思想

第一个思想:拆分 一定要将二叉树拆分为根、左子树、右子树首先就是要判断根结点是否为空。第二个思想:递归,善于使用递归。


LeetCode 965.单值二叉树

OJ链接

题目描述: 

如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。只有给定的树是单值二叉树时,才返回 true;否则返回 false

示例 1:

输入:[1,1,1,1,1,null,1]
输出:true

示例 2:

输入:[2,2,2,5,2]
输出:false

审题总结:

判断一个二叉树这所有节点的值是否相等,相等返回true,否则返回false;

思路讲解:首先判断根是否为空,如果为空直接返回true。不为空判断左子树是否存在,存在的话判断和根节点的值是否相等,如果相等返回true,否则返回false;继续判断右子树是否存在,存在的话判断和根节点的值是否相等,如果相等返回true,否则返回法false。左右子树都存在的话使用递归遍历。

接口代码

bool isUnivalTree(struct TreeNode* root){if(root==NULL)return true;if(root->left&&root->val!=root->left->val)return false;if(root->right&&root->val!=root->right->val)return false;return isUnivalTree(root->left)&&isUnivalTree(root->right);
}

LeetCode 100.相同的树


OJ链接

题目描述:给你两棵二叉树的根节点 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

思路讲解:

先将根拆结点拆分出来,两个根节点有三种情况,都为空、两个根节点中有一个为空。如果都为空,则返回true;如果有一个为空则返回false。根节点判断完成后判断根节点的值是否相等;使用递归遍历左子树和右子树。

接口代码

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

LeetCode 101.对称二叉树


OJ链接

题目描述:

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

示例 1:

输入:root = [1,2,2,3,4,4,3]
输出:true

示例 2:

输入:root = [1,2,2,null,3,null,3]
输出:falses

思路讲解:

这个题目和上个题目非常的相似,还是拆分为根、左子树、右子树。这里将两个子树看成单独的树,就和上面题的思路大差不差了。不同的是要判断左边的值和右边的值是否相等,这样才算对称。

实现代码

 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){if(root!=NULL){return isSameTree(root->left,root->right);}elsereturn true;
}

LeetCode 144 145 94 .二叉树的前、中、后序遍历

前序遍历OJ链接

中序遍历OJ链接

后序遍历OJ链接

关于二叉树的前、中、后序遍历的文章点击直达,这里我不做介绍。由于这三个题目是差不多只是将遍历的值用数组的形式便是出来,所以我就只讲解前序遍历、中、后序遍历交给大家练习。

题目描述:给你一棵二叉树的根节点 root ,返回其节点值的 后序遍历 

示例 1:

输入:root = [1,null,2,3]
输出:[3,2,1]

示例 2:

输入:root = []
输出:[]

示例 3:

输入:root = [1]
输出:[1]

思路讲解:

首先求出这棵二叉树有几个结点,根据结点动态开辟相应大小的空间。将根节点、动态开辟的数组,变量的地址,交给一个前序遍历的函数,根据前序遍历的规则,进行递归给数组赋值。

实现代码

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

LeetCode 572.另一棵树的子树

OJ链接

题目描述:

给你两棵二叉树 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]
输出:falses

思路讲解:

这个题和上面的LeetCode 100.相同的树基本上也大差不差。首先判断根节点是否为空,如果根节点为空,则直接返回false;不为空则直接使用是否为相同的树判断函数,判断所给树是否为子树,如果为真则直接返回true,使用递归遍历根节点的左右子树和所给所给子树相比较。

实现代码

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

 今天的分享就到此结束了,希望大家阅读完可以有所收获,同时也感谢各位看官的三连支持。文章有问题可以直接留言,我一定及时认真的修改。

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

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

相关文章

前端小案例-图片存放在远端服务器

前端小案例-图片存放在远端服务器 项目背景: 一个智能产业园的小程序由于可以控制很多种设备,可能有灯、空调、窗帘等智能设备。 现在面临以下问题: 需要存放很多设备的图标。设备的图标可能会进行修改。 为了解决上面的问题&#xff0c…

表达式转换

算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间。请设计程序将中缀表达式转换为后缀表达式。 输入格式: 输入在一行中给出不含空格的中缀表达式,可包含、-、*、/以及左右…

达梦错误码信息-PRO*C 错误码汇编

达梦错误码信息-PRO*C 错误码汇编 环境介绍 环境介绍 数据库版本环境:DM8.1-3-12-2023.04.17-187846-20040-ENT运行预编译命令行工具 dpc_new.exe 时,可能会就预编译过程中的一些错误进行报 错提示。错误码码值域如下:1)dpc 警告错误码值域为…

【C++】笔试训练(四)

目录 一、选择题二、编程题1、计算糖果2、进制转换 一、选择题 1、有以下程序&#xff0c;程序运行后的输出结果是&#xff08;&#xff09; #include<iostream> #include<cstdio> using namespace std; int main() {int m 0123, n 123;printf("%o %o\n&…

【数据结构】栈和队列-- OJ

目录 一 用队列实现栈 二 用栈实现队列 三 设计循环队列 四 有效的括号 一 用队列实现栈 225. 用队列实现栈 - 力扣&#xff08;LeetCode&#xff09; typedef int QDataType; typedef struct QueueNode {struct QueueNode* next;QDataType data; }QNode;typedef struct …

IntelliJ IDEA失焦自动重启服务的解决方法

IDEA 热部署特性 热部署&#xff0c;即应用正属于运行状态时&#xff0c;我们对应用源码进行了修改更新&#xff0c;在不重新启动应用的情况下&#xff0c;可以能够自动的把更新的内容重新进行编译并部署到服务器上&#xff0c;使修改立即生效。 现象 在使用 IntelliJ IDEA运…

2023品牌新媒体矩阵营销洞察报告:流量内卷下,如何寻找增长新引擎?

近年来&#xff0c;随着移动互联网的发展渗透&#xff0c;短视频、直播的兴起&#xff0c;新消费/新零售、兴趣电商/社交电商等的驱动下&#xff0c;布局线上渠道已成为绝大多数品牌的必然选择。 2022年&#xff0c;越来越多的品牌加入到自运营、自播的行列中&#xff0c;并且从…

linux(全志F1C100S/F1C200S)系列10:参考

目录 一、1.基于F1C200s的掌上电脑项目-Kashine2.小白自制Linux开发板系列-墨云 二、1.2. 一、 1.基于F1C200s的掌上电脑项目-Kashine https://blog.csdn.net/qq_41709234/category_12158774.html 2.小白自制Linux开发板系列-墨云 https://www.cnblogs.com/twzy/ 二、 1.…

golang gin——controller 模型绑定与参数校验

controller 模型绑定与参数校验 gin框架提供了多种方法可以将请求体的内容绑定到对应struct上&#xff0c;并且提供了一些预置的参数校验 绑定方法 根据数据源和类型的不同&#xff0c;gin提供了不同的绑定方法 Bind, shouldBind: 从form表单中去绑定对象BindJSON, shouldB…

数组字符串方法

数组方法 concat()copyWithin()entries()every()fill()filter()find()findIndex()findLastIndex()flat()flatMap()forEach()from()includes()indexOf()isArray()join()keys()lastIndexOf()map()of()pop()push()reduce()reduceRight()reverse()shift()slice()some()sort()splic…

【ONE·C++ || 异常】

总言 主要介绍异常。 文章目录 总言1、C异常1.1、C语言传统的处理错误的方式1.2、异常概念1.3、异常的基本用法1.3.1、异常的抛出和捕获1.3.1.1、异常的抛出和匹配原则1.3.1.2、 在函数调用链中异常栈展开匹配原则 1.3.2、异常的重新抛出1.3.2.1、演示一1.3.2.2、演示二 1.3.3…

【20】c++设计模式——>组合模式

组合模式定义 C组合模式&#xff08;Composite Pattern&#xff09;是一种结构型设计模式&#xff0c;他允许将对象组合成树形结构来表示“部分-整体”的层次结构&#xff1b;在组合模式中有两种基本类型的对象&#xff1a;叶子对象和组合对象&#xff0c;叶子对象时没有子对象…

C++11 Qt QFutureWatcher lambda

目录 Lambda 介绍 【QT】Qt之QFutureWatcher 简述 传参&#xff1a; 还可以使用 QProgressDialog 作为阻堵 函数&#xff0c;变成同步&#xff1b; 完成后&#xff0c;关闭&#xff1b; MyQProgressDialog 效果&#xff1a; Lambda 介绍 Lambda 函数也叫匿名函数&…

VueRouter与expres/koa中间件的关联

ueRouter: runQueue 路由守卫都是有三个参数to,from,next。其中next就是下方的fn执行时候传入的第二个参数(回调函数)&#xff0c;只有该回调执行后才会挨个遍历queue内的守卫。 中间件的作用 隔离基础设施与业务逻辑之间的细节。详细的内容位于《深入浅出Node.js》P210 另外一…

mysql面试题30:什么是数据库连接池、应用程序和数据库建立连接的过程、为什么需要数据库连接池、你知道哪些数据库连接池

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:什么是数据库连接池? 数据库连接池是一种用于管理和复用数据库连接的技术。它是在应用程序和数据库之间建立一组数据库连接,并以池的形式存储起…

Excel 转为 PDF,PNG,HTML等文件

1.安装 Spire.XLS for Java,下载jar包 下载地址 2.引入方式一&#xff08;我这里这种方式一直无法引入&#xff0c;都是失败&#xff0c;所以用的方式二&#xff09; <repositories><repository><id>com.e-iceblue</id><name>e-iceblue</na…

正样本、负样本、ROC、AUC

正样本、负样本 正样本和负样本通常与二分类问题相关联 正样本&#xff1a; 与真值对应的目标类别来说该样本为正样本。 &#xff08;正样本是在二分类问题中我们要寻找的目标类别&#xff09; 负样本&#xff1a; 与真值不对应的其他所有目标类别来说该样本为负样本。&…

Oracle笔记-对ROWNUM的一次理解(简单分页)

此博文记录时间&#xff1a;2023-05-05&#xff0c;发到互联网上是2023-10-09 这个在分页里面用得比较多&#xff0c;在MySQL中&#xff0c;通常使用limit去操作&#xff0c;而去感觉比较简单&#xff0c;Oracle中无此关键字。 通过查阅资料后&#xff0c;要实现分页需要用到…

对于使用win32 API获取性能计数器的理解

微软提供了获取性能计数器的接口&#xff0c;如下 LSTATUS RegQueryValueExA([in] HKEY hKey,[in, optional] LPCSTR lpValueName,LPDWORD lpReserved,[out, optional] LPDWORD lpType,[out, optional] LPBYTE lpData,[in, out, optional] L…

dubbo协议与triple协议的对比

分别使用dubbo协议和triple协议&#xff0c;按照官方文档搭建Demo。 两个流程对比下来发现&#xff0c;dubbo协议搭建起来比较简单直接&#xff0c;定义好接口&#xff0c;实现类&#xff0c;然后启动provider和consumer就完事了。而triple协议则需要先定义proto文件 然后增加…