【数据结构】单值二叉树 相同的树 翻转二叉树(五)

news2024/11/26 11:34:37

  目录

一,单值二叉树

题目详情:

解法:父子比较法

解题思路:

思路实现:

源代码:

二,相同的树

题目详情:

解法:比较法

解题思路:

思路实现:

源代码:

三,翻转二叉树

解法:替换法

解题思路:

思路实现:

源代码:


一,单值二叉树

题目详情:

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

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

提示:

1,给定树的结点树范围是【1,100】

2,每个结点的值都是整数,范围为【0,99】

示例1:

输入:nums = [1,1,1,1,1,NULL,1 ]

输出:true

示例2:

输入:nums = [2,2,2,5,2]

输出:false

解法:父子比较法

解题思路:

以上图为例:要判断根结点为(2)的二叉树是否为单值二叉树可以分解为(2)的左右子树是否为单值二叉树,这就很符合递归思路可以用递归解决;【(2)= 左子树 && 右子树】

判断条件:

当结点为NULL时返回 true

当子结点存在时,并且与父亲结点的值不相同时返回 false;

思路实现:

首先要判空:

//判断空
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;
}

 判断孩子,父亲所对应的值是否相同;

大事化小:以上条件都满足时,还需左右子树是否为单值二叉树,只有当左右子树都为单值二叉树时才为 true;

//化为两颗子树是否为单值树
return isUnivalTree(root->left) && isUnivalTree(root->right);

 要用逻辑与,需要双方为真时才返回 true;

源代码:

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

我们可以用示例来演算一遍,流程也是这样的;

像这种递归题目要演算其过程需要画图,这样才是最直观的;

二,相同的树

题目详情:

给你两棵二叉树的根结点 p 和 q ,编写一个函数来检验这两棵树是否相同;

如果两个树在结构上相同,并且结点具有相同的值,则认为它们是相同的;

提示:

两棵树上的结点数目都在范围【0,100】内

-104<=Node.val<=10 

示例1:

输入:p = [ 1,2,3 ],q = [ 1,2,3 ]

输出:true

示例2:

输入:p = [ 1,2 ],q = [ 1,2 ]

输出:false

示例3:

输入:p = [ 1,2,1 ],q = [ 1,2,2 ]

输出:false

解法:比较法

解题思路:

要判断两棵树是否一致,要考虑的是他们的结点是否都存在,结点对应的值是否相同;

以上图为例:根结点相同了,还要判断其左右子树是否也相同,然后层层往下,这道题也是用递归思想;

思路实现:

首先要判断他们的结点是否对应存在:

    //双方都为空
    if(p==NULL && q==NULL)
    {
      return true;
    }
    //一方为空另一方不为空
    if((p==NULL || q==NULL) 
    {
      return false;
    }

当双方对应的结点都为空时返回 true

当双方对应的结点只有一方为空,另一方不为空时,返回 false

然后判断它们对应的结点的值的情况:

    //判断所对应的值是否相同
    if(p->val != q->val)
    {
      return false;
    }

当所对应的值不相等则返回 false;

大事化小:当以上条件都满足时,还需要判断这两棵树所对应的左右子树是否相同;

    //判断其对应的左右子树是否也相同
    return isSameTree(p->left,q->left) && isSameTree(p->right,q->right);

源代码:

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

这就是判断两颗二叉树是否相同问题的解题思路了,还是利用递归;

三,翻转二叉树

题目详情:

给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点

示例1:

输入:root = [ 4,2,7,1,3,6,9 ]

输出:[ 4 7 2 9 6 3 1 ]

示例2:

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

输出:[ 2,3,1]

示例3:

输入:root = [ ]

输出:[ ]

解法:替换法

解题思路:

翻转翻转所谓翻转其实就是将左右子树换个位置而已,直接将其交换,层层交换下去直至NULL,用递归来实现;

思路实现:

首先还是判空,如果为空直接返回NULL即可;

然后直接交换左,右子树,再让其左,右子树也如此下去,就完成了对整颗树的翻转了,在返回根结点即可;

源代码:

void swap(struct TreeNode** left,struct TreeNode** right)
{
    struct TreeNode* tmp=*left;
    *left=*right;
    *right=tmp;
}

struct TreeNode* invertTree(struct TreeNode* root){
    //判空
    if(root==NULL)
    {
        return NULL;
    }
    //交换
    swap(&root->left,&root->right);
    //左子树翻转
    invertTree(root->left);
    //右子树翻转
    invertTree(root->right);
    return root;
}

基本上与二叉树相关的练习都要使用递归思想前期培养递归思路最好就是画图解析,这个很重要,画图能让我们更直观的感受结点之间的关系,特别是感受那个返回的过程领悟其中的奥妙,久而久之我们对于递归的思路就更加清晰了,不至于摸不着北;

第五阶段就到这里了,这阶段带大家刷道些题目来感受一下二叉树的魅力!

后面博主会陆续更新;

如有不足之处欢迎来补充交流!

完结。。


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

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

相关文章

Visual Studio 2023年下载、安装教程、亲测有效

visual studio 2022&#xff08;vs 2022&#xff09;是由微软官方出品的最新版本的开发工具包系列产品。它是一个完整的开发工具集&#xff0c;可完美支持C#、C、Python、Visual Basic、Node.js、HTML、JavaScript等主流的编程语言&#xff0c;帮助程序员轻松地完成调试、探查和…

【C++模拟实现】map、set容器的模拟实现

【C模拟实现】map、set容器的模拟实现 目录 【C模拟实现】map、set容器的模拟实现map、set模拟实现的代码&#xff08;insert部分&#xff09;部分一&#xff1a;红黑树的迭代器以及红黑树部分二&#xff1a;对set进行封装部分三&#xff1a;对map进行封装 遇到的问题以及解决方…

如何在本地 Linux 主机上实现 Yearning SQL 审核平台的远程访问?

文章目录 前言1. Linux 部署Yearning2. 本地访问Yearning3. Linux 安装cpolar4. 配置Yearning公网访问地址5. 公网远程访问Yearning管理界面6. 固定Yearning公网地址 前言 Yearning 简单, 高效的MYSQL 审计平台 一款MYSQL SQL语句/查询审计工具&#xff0c;为DBA与开发人员使用…

快速了解Apipost

随着数字化转型的加速&#xff0c;API&#xff08;应用程序接口&#xff09;已经成为企业间沟通和数据交换的关键。而在API开发和管理过程中&#xff0c;API文档、调试、Mock和测试的协作显得尤为重要。Apipost正是这样一款一体化协作平台&#xff0c;旨在解决这些问题&#xf…

yolov5使用最新MPDIOU损失函数,有效和准确的边界盒回归的损失,优于GIoU/EIoU/CIoU/EIoU(附代码可用)

文章目录 1. 论文1.1. 主要目的1.2. 设计思路2 代码3.总结1. 论文 MPDIoU: A Loss for Efficient and Accurate Bounding Box Regression (一个有效和准确的边界框损失回归函数) 论文地址 1.1. 主要目的 当预测框与边界框具有相同的纵横比,但宽度和高度值完全不同时,大多数…

【PyTorch 攻略(5/7)】训练和模型

一、说明 训练模型是一个迭代过程。每次迭代称为纪元。该模型对输出进行猜测&#xff0c;计算其猜测中的误差&#xff08;损失&#xff09;&#xff0c;收集误差相对于其参数的导数&#xff0c;并使用梯度下降优化这些参数。 我们从这里加载前面的代码。 %matplotlib inl…

UML活动图

在UML中&#xff0c;活动图本质上就是流程图&#xff0c;它描述系统的活动、判定点和分支等&#xff0c;因此它对开发人员来说是一种重要工具。 活动图 活动是某件事情正在进行的状态&#xff0c;既可以是现实生活中正在进行的某一项工作&#xff0c;也可以是软件系统中某个类…

蓝牙核心规范(V5.4)10.3-BLE 入门笔记之BIS篇

BIS全称:广播同步流 A BIS(Broadcast Isochronous)流提供了在一个发射器(源)和多个接收器(汇)设备之间的广播等时通信。数据以链路层PDUs的形式进行传输,称为BIS数据PDU。控制信息以BIS控制PDUs的形式进行传输。LE-BIS(BIS)逻辑传输在整体数据传输架构中如下图所示。…

github 上传和拉取 support for passward authentication was removed...

参考下面这篇文章 remote: Support for password authentication was removed on August 13, 2021_IT博客技术分享的博客-CSDN博客 但是记得把repositories和 permissions的选项都点上&#xff0c;不然又会报下面的错误。

shiro反序列化漏洞Shiro-550/Shiro-721反序列化

文章目录 shiro反序列化漏洞Shiro-550反序列化漏洞&#xff08;CVE-2016-4437&#xff09;漏洞简介漏洞原理 Shiro-721反序列化漏洞&#xff08;CVE-2019-12422&#xff09;Shiro550和Shiro721的区别是什么漏洞指纹漏洞介绍漏洞原理攻击流程 漏洞复现&#xff1a;CVE-2016-4437…

AOSP Android 系统源码编译出的framework.jar和android.jar之间的区别

简介 AOSP&#xff08;Android Open Source Project&#xff09;编译出的 android.jar 和 framework.jar 都是 Android 平台开发中的重要组件&#xff0c;但它们有不同的作用和用途&#xff1a; android.jar&#xff1a; 用途&#xff1a;android.jar 包含了 Android API 的定…

linux常用命令(4):mkdir命令(创建目录)

文章目录 一、命令简介二、命令格式三、常用示例 一、命令简介 mkdir&#xff08;make directories&#xff09;创建目录。 若指定目录不存在则创建目录。若指定目录已存在&#xff0c;则会提示已存在而不继续创建。 touch与mkdir的区别? 很多人可能会把这个搞混淆&#xff…

Python 函数的说明文档

视频版教程 Python3零基础7天入门实战视频教程 用"“” “”"备注说明&#xff0c;然后我们调用函数的地方&#xff0c;鼠标移动上去就能看到函数的说明。提供代码的可读性。 def add(x, y):"""两数相加函数:param x: 两数相加数x:param y: 两数相加…

Verilog零基础入门(边看边练与测试仿真)-状态机-笔记(7-10讲)

文章目录 第七讲第八讲第九讲第十讲 第七讲 1、最简单的状态机-三角波发生器 1、两种状态的代码&#xff1a; //最简单的状态机&#xff0c;三角波发生器&#xff1b; timescale 1ns/10ps module tri_gen(clk,res,d_out); input clk; input res; o…

vr飞机驾驶舱模拟流程3D仿真演示加大航飞安全法码

众所周知&#xff0c;航空航天飞行是一项耗资大、变量参数很多、非常复杂的系统工程&#xff0c;因此可利用虚拟仿真技术经济、安全及可重复性等特点&#xff0c;进行飞行任务或操作的模拟&#xff0c;以代替某些费时、费力、费钱的真实试验或者真实试验无法开展的场合&#xf…

Lua学习笔记:在Visual Studio中调试Lua源码和打断点

前言 本篇在讲什么 调试Lua源码 本篇需要什么 对Lua语法有简单认知 依赖Visual Studio工具 本篇的特色 具有全流程的图文教学 重实践&#xff0c;轻理论&#xff0c;快速上手 提供全流程的源码内容 ★提高阅读体验★ &#x1f449; ♠ 一级标题 &#x1f448; &…

C#中的方法

引言 在C#编程语言中&#xff0c;方法是一种封装了一系列可执行代码的重要构建块。通过方法&#xff0c;我们可以将代码逻辑进行模块化和复用&#xff0c;提高代码的可读性和可维护性。本文将深入探讨C#中的方法的定义、参数传递、返回值、重载、递归等方面的知识&#xff0c;…

【Hadoop】HDFS API 操作大全

&#x1f341; 博主 "开着拖拉机回家"带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——&#x1f390;开着拖拉机回家_Linux,大数据运维-CSDN博客 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341; 希望本文能够给您带来一定的帮助&#x1…

Vue3 Ajax(axios)异步

文章目录 Vue3 Ajax(axios)异步1. 基础1.1 安装Ajax1.2 使用方法1.3 浏览器支持情况 2. GET方法2.1 参数传递2.2 实例 3. POST方法4. 执行多个并发请求5. axios API5.1 传递配置创建请求5.2 请求方法的别名5.3 并发5.4 创建实例5.5 实例方法5.6 请求配置项5.7 响应结构5.8 配置…

【配代码演示】Cookie和Session的区别

一、共同之处&#xff1a; cookie和session都是用来跟踪浏览器用户身份的会话方式。 二、工作原理&#xff1a; 1.Cookie的工作原理 &#xff08;1&#xff09;浏览器端第一次发送请求到服务器端 &#xff08;2&#xff09;服务器端创建Cookie&#xff0c;该Cookie中包含用户的…