二叉树的OJ练习题

news/2024/4/25 6:03:46/文章来源:https://blog.csdn.net/qq_54717101/article/details/127433826

1.单值二叉树

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

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

思路:比较每个父亲节点与左右非空孩子节点的值。

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.二叉树的最大深度

描述:求二叉树的深度

链接:104. 二叉树的最大深度 - 力扣(LeetCode)

思路:比较每个根节点(递归的所有节点都是根)的左右高度差,高的那个加上根节点长度1。

 代码:

int maxDepth(struct TreeNode* root){

    if(root==NULL)

    {

        return 0;

    }

    int left=maxDepth(root->left);//遍历左边的节点

    int right=maxDepth(root->right);//遍历右边的节点

    return left>right?left+1:right+1;//左右边高的那个加上根节点(高度为1)

}

最后一次比较就是左边的高度与右边的高度,最后长的那个加上根节点高度1.

 3.翻转二叉树

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

 链接:226. 翻转二叉树 - 力扣(LeetCode)

思路:交换每个父亲节点的左右孩子节点位置

代码:

//因为需要返回节点,所以用子函数去递归交换

void _invertTree(struct TreeNode* root)

{

    if(root==NULL)

    {

        return;

    }

    //父亲节点不等于NULL,则交换左右子树节点

    struct TreeNode*tmp=root->left;

    root->left=root->right;

    root->right=tmp;

    _invertTree(root->left);//左子树的每个节点的左右孩子交换

    _invertTree(root->right);//右子树的每个节点左右孩子交换

}

struct TreeNode* invertTree(struct TreeNode* root){

    if(root==NULL)

    {

        return NULL;

    }

    _invertTree(root);

    return root;

}

4.相同的树 

描述:给定两颗树,判断他们的数据域是否相同

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

思路:比较两棵树(p和q)所有相同位置的数据。节点存在有三种情况,1.p和q的节点都不存在,都是NULL,相同。2.p和q只有一个存在节点,两树必不相同,3.p和q的节点都存在,此时比较数据。

代码:

bool isSameTree(struct TreeNode* p, struct TreeNode* q){

    //两个都为空 true  

    if(p==NULL&&q==NULL)

    {

        return true;

    }

    //其中一个为空 false

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

}

5.二叉树的前序遍历 

描述:给你二叉树的根节点 root ,返回它节点值的前序遍历。前序遍历的数据存储到malloc出来的数组中,最后返回数组。

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

思路:求树的节点个数为自定义数组开辟空间,递归实现前序遍历

代码:

//得到树的节点个数,开辟数组空间

int TreeSize(struct TreeNode* root)

 {

     if(root==NULL)

     {

         return 0;

     }

     return TreeSize(root->left)+TreeSize(root->right)+1;

 }

//子函数递归

void _preorderTraversal(int*a, struct TreeNode* root,int* pi)//pi为数组递归下标位置

{

    if(root==NULL)

    {

        return;

    }

    a[(*pi)++]=root->val;

     _preorderTraversal(a,root->left,pi);

     _preorderTraversal(a,root->right,pi);

}

int* preorderTraversal(struct TreeNode* root, int* returnSize){

    int size=TreeSize(root);

    int* a=(int*)malloc(sizeof(int)*size);

    int i=0;

    //返回值不容易写递归条件 写一个子函数

    _preorderTraversal(a,root,&i);

    *returnSize=size;

    return a;

}

6.判断一颗二叉树是否是平衡二叉树

描述:一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。

链接:110. 平衡二叉树 - 力扣(LeetCode)

思路:比较每个节点的左右字树高度差

代码:

//求高度

int HighTree(struct TreeNode* root)

{

    if(root==NULL)

    {

        return 0;

    }

    int left=HighTree(root->left);

    int right=HighTree(root->right);//左右高的那个返回

    return left>right?left+1:right+1;

}

bool isBalanced(struct TreeNode* root){

    if(root==NULL)

    {

        return true;

    }

    //思路:求左右子树的高度,比较高度的绝对值

    int left=HighTree(root->left);

    int right=HighTree(root->right);

    int dis=abs(left-right);

    if(dis>1)

    {

        return false;

    }

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

}

7.另一颗树的字树 

描述:给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在,返回 true ;否则,返回 false。

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

思路:root的每一棵子树与subRoot比较 

 

代码:

//比较函数

bool issametree(struct TreeNode* root, struct TreeNode* subRoot)

 {

    if(root==NULL&&subRoot==NULL)

    {

        return true;

    }

    //2.其中之一为空

    if(root==NULL||subRoot==NULL)

    {

        return false;

    }

    

    //3.都不为空,比较值

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

    {

        return false;

    }

    return issametree(root->left,subRoot->left)&&issametree(root->right,subRoot->right);

 }

bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot){

    //思路:root的每一棵子树都与subRoot比较

     if(root==NULL)

     {

         return false;

     }

     if(issametree(root,subRoot))

     {

         return true;

     }

    return isSubtree(root->left,subRoot)||isSubtree(root->right,subRoot);//root左边或者右边相同即可

}

8.对称二叉树

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

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

思路:判断根节点的左子树与右子树是否满足镜像对称,镜像对称:左子树的遍历方式和右子树的遍历方式是相反的。

 代码:

bool _isSymmetric(struct TreeNode* r,struct TreeNode* l)

{

   if(l==NULL&&r==NULL)

    {

        return true;

    }

    if(l==NULL||r==NULL)

    {

        return false;

    }

    if(l->val!=r->val)

    {

        return false;

    }

    return _isSymmetric(r->left,l->right)&&_isSymmetric(r->right,l->left);//1.左树l左边走,右树r右边走。2.左树l右边走,右树r左边走

}

bool isSymmetric(struct TreeNode* root){

    if(root==NULL)

    {

        return true;

    }

    return _isSymmetric(root->left,root->right);//子函数比较左右子树是否相同

}

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

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

相关文章

世界陶瓷卫浴100强榜单发布!

​  经过一年的严格数据审查,科学统计分析,备受全行业期待的 【世界陶瓷卫浴100强统计排行榜 】于2022年10月19日在中国佛山正式发布,除了陶瓷卫浴企业100强总榜以外,还发布了全球瓷砖企业30强、全球卫浴企业20强,全…

Python中的对象池是什么

在程序设计中,创建物体模块主要是通过生成对象来实现。当对象使用结束后,则会成为不再需要的模块进行销毁。 而在系统进行对象的生成与销毁过程中会大量的增加内存的消耗,同时对象的销毁往往会留下残留的信息,这样将会伴随内存泄露…

javaWeb SSM车辆调度系统myeclipse定制开发mysql数据库网页模式java编程SpringMVC

一、源码特点 JSP SSM车辆调度系统是一套完善的web设计系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码 系统采用SSM框架,系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql5.0&a…

swagger动态开关实践

swagger动态开关实践1. 背景2. 配置文件监听2.1 基于注解2.2 基于jdk3. swagger改造3.1 bean刷新3.2 方法重写4. 总结5. 参考资料1. 背景 系统漏洞扫描,扫出了swagger的问题。这个问题其实比较基础,那就是生产环境不应该开启swagger! 但是&…

FreeRTOS 软件定时器的使用

FreeRTOS中加入了软件定时器这个功能组件,是一个可选的、不属于freeRTOS内核的功能,由定时器服务任务(其实就是一个定时器任务)来提供。 软件定时器是当设定一个定时时间,当达到设定的时间之后就会执行指定的功能函数&…

el-switch接口实现

后台返回的数据: active-textswitch 打开时的文字描述string——inactive-textswitch 关闭时的文字描述string——active-valueswitch 打开时的值boolean / string / number—trueinactive-valueswitch 关闭时的值boolean / string / number—falseactive-colorswi…

Enzo丨艾美捷Enzo Ciglitazone解决方案

艾美捷Enzo Ciglitazone是一种噻唑烷二酮类降血糖药。它在遗传性肥胖的C57 Bl/6 ob/ob小鼠中显示抗高血糖活性,并且是选择性PPARγ激动剂(EC50=3M)。抑制人间充质干细胞中HUVEC分化和血管生成,并刺激脂肪生成和减少成骨…

区块链 — Overview

文章目录区块链的概念区块链数据结构区块链的基础技术哈希运算数字签名共识算法智能合约P2P网络区块链分类公有链联盟链私有链区块链的概念 狭义上,区块链是一种按照时间顺序将数据区块以顺序相连的方式组合成的一种链式数据结构,并以密码学方式保证的不…

深度神经网络图像识别,深度神经网络图像配准

如何用Python和深度神经网络寻找相似图像 代码首先,读入TuriCreate软件包import turicreate as tc我们指定图像所在的文件夹image,让TuriCreate读取所有的图像文件,并且存储到data数据框data tc.image_analysis.load_images(./image/)我们来…

《python 可视化之 matplotlib》第一章 折线图 plot

《python 可视化之 matplotlib》第一章 折线图 本章节内容包括以下几方面内容: 绘制曲线 yx2yx^2yx2;让曲线更加光滑;常见的相关属性设置;多条折线图的绘制;折线图之间的颜色填充;时间序列可视化;常见问题…

iNFTnews|在元宇宙中探索NFT的无限可能

元宇宙正在使我们当下的生活发生显著变化。 我们都玩过很多电子游戏,看过很多相关的科幻电影,也有过很多关于元宇宙进入我们日常生活后,我们周围的事物将会受到怎样的巨大影响的讨论。 我们很快就会看到,如此先进的技术突破将逐…

人工神经网络概念及组成,人工神经网络基本概念

1、什么是BP神经网络? BP算法的基本思想是:学习过程由信号正向传播与误差的反向回传两个部分组成;正向传播时,输入样本从输入层传入,经各隐层依次逐层处理,传向输出层,若输出层输出与期望不符&…

含汞废水的深度处理方法

CH-95 是一款为了从工业废水中去除回收汞和贵金属而专门开发的螯合树脂。拥有聚乙烯 异硫脲官能基的大孔树脂,这种树脂对汞有极高的选择性。钠,碱土,铁铜等重金属等不能干扰 其对汞的选择性去除。 CH-97 是一款含有附着甲基硫醇聚苯乙烯共…

基于PB的企业人力资源信息系统设计与实现

目 录 摘 要 I Abstract II 第1章 引言 1 1.1选题背景及意义 1 1.2发展现状 1 1.3论文结构 2 第2章 系统分析 3 2.1 系统目标 3 2.2 系统需求分析 3 第3章 系统设计 5 3.1 系统功能结构设计 5 3.2 数据库设计与实现 7 3.2.1数据库需求分析 7 3.2.2数据库概念结构设计 8 3.2.3数…

[oeasy]python0010 - python虚拟机解释执行py文件的原理

解释运行程序 🥊 回忆上次内容 我们这次设置了断点 设置断点的目的是更快地调试调试的目的是去除​​bug​​别害怕​​bug​​一步步地总能找到​​bug​​这就是程序员基本功 调试​​debug​​ 我心中还是有疑问 ​​python3​​ 是怎么解释​​hello.py​​ 的…

Python实现SSA智能麻雀搜索算法优化支持向量机分类模型(SVC算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 麻雀搜索算法(Sparrow Search Algorithm, SSA)是一种新型的群智能优化算法,在2020年提出&am…

pytorch:常见的pytorch参数初始化方法总结

pytorch参数初始化1. 关于常见的初始化方法1) 均匀分布初始化torch.nn.init.uniform_()2) 正态分布初始化torch.nn.init.normal_()3) 常量初始化torch.nn.init.constant_()4) Xavier均匀分布5)Xavier正态分布初始化6) kaiming均匀分布初始化7) kaiming正…

除了pid还有什么控制算法,类似pid算法还有哪些

什么是专家PID?他和传统的PID有什么区别? PID是智能控制啊,比如要控制一个水管的水流量,通过流量计,开关阀,让PID来控制开关阀的开关大小使水流量正确.专家PID记得是PID的高级设置,某些个场合一般的PID无法使用,出现了了专用的,有特殊功能的.记忆中是这…

防火墙的ISP选路

拓补图: 实验目的: 让R1走ISP1的路径访问192.168.1.1,R2走ISP2的路径访问172.16.1.1 1. IP地址的配置略 2. 防火墙区域的划分(防火墙的g1/0/2接口是属于ISP1接口,所以需要自己新建一个区域然后添加接口,…

测试界的飞虎队:测试人才战略——测试行业的精英战略(学习了)

一、前言 提到飞虎队,大家第一印象就是精英。相信绝大多数公司都希望能组件出一支优秀的测试队伍,来支撑自己的业务,很多公司都喊出了精英化战略。既然如此,就命中一个话题--测试人才战略。 有几个问题是不得不面对的&#xff1a…