初阶数据结构——二叉树题目

文章目录

  • 一、单值二叉树
  • 二、检查两颗树是否相同
  • 三、另一棵树的子树
  • 四、二叉树的前序遍历
  • 五、对称二叉树


一、单值二叉树

单值二叉树

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

在这里插入图片描述
需要保证全部都相等,自然就需要左右子树都没问题。先想一个小问题,当遍历一个子树时,最终会遇到空,遇到空就要返回true,让它安全返回,不影响判断,这里也就说我们需要递归来遍历。那么现在从根开始,首先有一个判断,如果是空就返回true,跳过这个判断后,如果进行下一步?我们要让根和其他所有数字都相等,这其中最容易判断的就是根的左右子树是否相等,所以可能会写出这一个判断语句

if(root->val != root->right->val)

这个语句还欠缺考虑。要知道,现在我们的思路是用一个根节点去和它的两个子树比较是否相等,前提是两个子树都存在。前面的判断空是在判断root,也就是判断这个根节点,并没有判断它的子树们,所以应该这样写:if(root->right && root->right->val) 。如果符合条件了,那么这就不是单值二叉树,就得返回false了,返回的false也必须让之前的递归全部都false,最终才是false。

先不想这个,回到刚才的代码,我们只写了右边,还需要写左边,也是一样,也就是两个if,都需要判断。写完这三个判断后,就得递归了。前面说到false得让整体,所有的递归都为false,并且从题目中也知道,左右子树节点的值都得等于根才行,所以当往下继续遍历的时候,需要用&&来连接

return isUnivalTree(root->left) && isUnivalTree(root->right);

整体的代码

bool isUnivalTree(struct TreeNode* root) 
{
    if(!root) 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 ,编写一个函数来检验这两棵树是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。

在这里插入图片描述
在这里插入图片描述
两棵树比较,值要相等,结构要相同。从根开始,如果两个值相等,这肯定符合要求,但是这时候不能返回true,我们还要继续往下判断,让递归进行下去,去看子树的情况,判断结构是否相同,但是不相等肯定就不行,就不是相同的树,所以可以写如果值不相等,就返回false。要让程序能够持续到最低层,来判断整体的结构是否相同,就得让其他判断条件也不能阻碍递归的前进,直到我们来到空,比如上面的例一中,2的左子树,这时候为空,如果另一棵树此时也是空,那就没问题,返回true,再往回走,去判断它的父节点的右子树;如果一个为空,一个不为空,那肯定不行,就直接返回false。而这里有一个巧妙的写法,先写两个都是空的判断,如果不是,那就要么是一空一不空,要么两个都不空,那就可以写if(p == NULL || q == NULL) 有一个为空就说明结构不相同了,因为是一空一不空。

上面这段已经写了三个判断,这三个判断就足以完成题目的要求,在最后加一个左右子树的递归即可。

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 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在,返回 true ;否则,返回 false 。二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有后代节点。tree 也可以看做它自身的一棵子树。
在这里插入图片描述
在这里插入图片描述

既然要找子树,也就是要找到root中subRoot相同的一部分,这里就能用到刚才写的isSameTree。root有很多个子树,我们只能一个个比较,看看是否和subRoot相同,从根开始,整棵树也是root的子树,所以从root开始比较,如果root和subRoot是相同的树,那么就返回true。如果一次比较,发现不相同,程序得继续往下寻找,像例2那样,2下面还有一个0,那么从4开始比较,下面的部分就不相同,不相同,什么也不返回,继续找4的左子树和右子树进行比较。这里会想到我们要写两个式子,一个参数中有root->left,另一个是root->right,这两个只要有一个是true就说明是子树,那么程序就可以结束了,所有用或。一直往下比较,什么时候停止?如果一条路线到了空,说明这一路上的节点下的树都不和subRoot相同,那就说明这条路都不符合条件,那就返回false,返回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);
}

bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot) {
    if(!root) return false;
    if(isSameTree(root, subRoot)) return true;
    return isSubtree(root->left, subRoot) || isSubtree(root->right, subRoot);
}

四、二叉树的前序遍历

前序遍历

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

在这里插入图片描述
在这里插入图片描述

用递归算法解。前序遍历是比较简单的,不过这里要求把遍历的结果放到一个数组中,*returnSize是数组大小,最后返回数组。虽然提示中给了节点数目范围,但用一个函数来计算给的二叉树的节点数目更适合所有树。

int TreeSize(struct TreeNode* root)
{
    if root == NULL ? 0 : TreeSize(root->left) + TreeSize(root->right) + 1;
}

void preorder(struct TreeNode* root, int* array, int* i)
{
    if(root == NULL)
    {
        return;
    }
    array[(*i)++] = root->val;
    preorder(root->left, array, i);
    preorder(root->right, array, i);
}

int* preorderTraversal(struct TreeNode* root, int* returnSize){
    *returnSize = TreeSize(root);
    int* array = (int*)malloc(sizeof(int) * (*returnSize));
    int i  = 0;
    preorder(root, array, &i);
    return array;
}

五、对称二叉树

对称二叉树

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

在这里插入图片描述
在这里插入图片描述

对称二叉树,根的左右子树需要比较,看是否对称,这里能够想到判断相同,不过有一定差别,根节点值同样也要相等,左子树和另一个的右子树比较,右子树和另一个的左子树比较。

另一个思路就是翻转二叉树,把左右子树翻转过来,那么就可以直接比较相同了,翻转不难,大事化小,遍历最低一层的子树,然后逐个翻转,往上走,最后完成翻转。但其实这个思路不行,如果翻转二叉树,那么翻转后原二叉树就不存在了,我们只能复制一份,然后再翻转才行,但是复制又得走一遍递归了,所以这个思路更复杂。

bool isSameTree(struct TreeNode* p, struct TreeNode* q){
    if(!p && !q)
    {
        return true;
    }
    if((p == NULL || q == NULL) || (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 true;
    }
    return isSameTree(root->left, root->right);
}

这里把两个return false的语句合并到了一起。

结束。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Docker学习笔记,包含docker安装、常用命令、dockerfile、docker-compose等等

😀😀😀创作不易,各位看官点赞收藏. 文章目录 Docker 学习笔记1、容器2、Docker 安装3、Docker 常用命令4、Docker 镜像5、自定义镜像5.1、镜像推送到阿里云5.2、镜像私有库 6、数据卷7、Docker 软件安装8、Docker File8.1、常见保…

基于python+Xception算法模型实现一个图像分类识别系统

一、目录 Xception介绍数据集处理模型训练模型评估项目扩展 二、Xception介绍 在计算机视觉领域,图像识别是一个非常重要的任务,其应用涵盖了人脸识别、物体检测、场景理解等众多领域。随着深度学习技术的发展,深度卷积神经网络&#xff0…

哈工大计算机网络课程网络安全基本原理之:身份认证

哈工大计算机网络课程网络安全基本原理之:身份认证 在日常生活中,在很多场景下我们都需要对当前身份做认证,比如使用密码、人脸识别、指纹识别等,这些都是身份认证的常用方式。本节介绍的身份认证,是在计算机网络安全…

android 如何分析应用的内存(十三)——perfetto

android 如何分析应用的内存(十三) 本篇文章是native内存的最后一篇文章——perfetto perfetto简介 从2018年始,android开发者峰会正式推出perfetto工具。从此perfetto成为安卓最重要的工具之一。在2018年以前,android使用syst…

OpenHarmony开源鸿蒙学习入门 - 基于3.2Release 应用开发环境安装

OpenHarmony开源鸿蒙学习入门 - 基于3.2Release 应用开发环境安装 基于目前官方master主支,最新文档版本3.2Release,更新应用开发环境安装文档。 一、安装IDE: 1.IDE安装的系统要求 2.IDE下载官网链接(IDE下载链接) …

小红书2020校招测试开发后端笔试题卷三

//完全背包求组合数 #include <iostream> #include<vector> #include<set> #include<map> #include<algorithm> using namespace std; int value[300]; // vector<int>vis; // vector<int>vis1; map<vector<int>,int>m…

Tomcat的基本使用,如何用Maven创建Web项目、开发完成部署的Web项目

Tomcat 一、Tomcat简介二、Tomcat基本使用三、Maven创建Web项目3.1 Web项目结构3.2开发完成部署的Web项目3.3创建Maven Web项目3.3.1方式一3.3.2方式二&#xff08;个人推荐&#xff09; 总结 一、Tomcat简介 Web服务器&#xff1a; Web服务器是一个应用程序&#xff08;软件&…

深入探究Java面向对象的三大特征:封装、继承、多态

文章目录 1. 封装&#xff08;Encapsulation&#xff09;2. 继承&#xff08;Inheritance&#xff09;3. 多态&#xff08;Polymorphism&#xff09;结语 导语&#xff1a;Java是一门面向对象的编程语言&#xff0c;其核心思想是将现实世界中的事物抽象成对象&#xff0c;并通过…

PACS系统源码:支持三维重建功能、集成放射科管理RIS系统、图文报告编辑、打印、多级审核机制

PACS系统源码 PACS系统是以最新的IT技术为基础&#xff0c;遵循医疗卫生行业IHE/DICOM3.0和HL7标准&#xff0c;开发的多功能服务器和阅片系统。通过简单高性能的阅片功能&#xff0c;支持繁忙时的影像诊断业务&#xff0c;拥有保存影像的院内Web传输及离线影像等功能&#xf…

语义分割、转置卷积、风格迁移(第十二次组会)

TOC 语义分割 图像分割、实例分割 上采样、下采样 转置卷积 全卷积网络 风格迁移

网络安全 Day24-select高级用法和多表连接

select高级用法和多表连接 1. select 多子句单表高级实践1.1 select 多子句高级语法1.2 聚合函数1.3 group by 实践1.4 having 筛选1.5 order by 排序1.6 limit 2. 多表连接 1. select 多子句单表高级实践 1.1 select 多子句高级语法 where 和 having 区别是后者是分组后进行…

JAVASE---类和对象

1. 面向对象的初步认知 1.1 什么是面向对象 Java是一门纯面向对象的语言(Object Oriented Program&#xff0c;简称OOP)&#xff0c;在面向对象的世界里&#xff0c;一切皆为对象。面向对象是解决问题的一种思想&#xff0c;主要依靠对象之间的交互完成一件事情。用面向对象的…

测试开源C#人脸识别模块ViewFaceCore(5:质量检测和眼睛状态检测)

ViewFaceCore模块中的FaceQuality支持预测人脸质量&#xff0c;最初以为是预测人体体重&#xff0c;实际测试过程中才发现是评估人脸图片质量&#xff0c;主要调用Detect函数执行图片质量检测操作&#xff0c;其函数原型如下所示&#xff1a; //// 摘要:// 人脸质量评估///…

科普 | OSI模型

本文简要地介绍 OSI 模型 1’ 2’ 3。 更新&#xff1a;2023 / 7 / 23 科普 | OSI模型 术语节点链路协议网络拓扑 概念作用结构应用层表示层会话层传输层网络层数据链路层物理层 数据如何流动OSI 和TCP/IP 的对应关系和协议参考链接 术语 节点 节点&#xff08; Node &#…

canvas实现图片平移,缩放的例子

最近有个水印预览的功能&#xff0c;需要用到canvas 绘制&#xff0c;canvas用的不是很熟&#xff0c;配合chatAI 完成功能。 效果如下 代码如下 原先配置是响应式的&#xff0c;提出来了就不显示操作了&#xff0c;模拟值都写死的 界面给大家参考阅读。 <!DOCTYPE html…

element-tree-line el-tree 添加结构线 添加虚线

概览&#xff1a;给element组件添加上虚线&#xff0c;通过使用插件element-tree-line 参考连接&#xff1a; 参考别人的博客 安装插件&#xff1a; # npm npm install element-tree-line -S # yarn yarn add element-tree-line -S main.js全局注册引入插件&#xff1a; imp…

PCL点云处理之最小二乘空间直线拟合(3D) (二百零二)

PCL点云处理之最小二乘空间直线拟合(3D) (二百零二) 一、算法简介二、实现代码三、效果展示一、算法简介 对于空间中的这样一组点:大致呈直线分布,散乱分布在直线左右, 我们可采用最小二乘方法拟合直线,更进一步地,可以通过点到直线的投影,最终得到一组严格呈直线分布…

气象名词解释

文章目录 SAMPSAAMO SAM SAM(Southern Annualr Mode) 南半球环状模&#xff0c;是南半球大气环流和气候变异的一种重要现象。具有如下特点&#xff1a; 主要特点&#xff1a; 赤道附近环流&#xff1a;在 SAM 正相位期间&#xff0c;赤道附近的环流增强&#xff0c;称为正 SA…

使用多数据源dynamic-datasource-spring-boot-starter遇到的问题记录

记录使用多数据源dynamic-datasource-spring-boot-starter遇到的问题&#xff1a; 1、工程启动失败 缺少clickhouse连接驱动&#xff0c;引入对应的maven依赖 <!--ck连接驱动--><dependency><groupId>ru.yandex.clickhouse</groupId><artifactId>…

vue3搭建Arco design UI框架

技术&#xff1a;Vue3.2.40 UI框架&#xff1a;Arco design 2.44.7 需要安装:yarn 1.22.19 和npm 8.19.4 1.第一步安装本地全局arco脚手架 管理员运行CMD npm i -g arco-cli安装成功后如下&#xff1a; 2.第二步在需要存放项目的文件夹拉取项目 我这里把项目存放在 D:\W…