leetcode-----二叉树习题

news2024/11/27 15:42:56

 目录

前言

1. 二叉树的中序遍历

2. 相同的树

3. 二叉树的最大深度

4. 二叉树的最小深度

5.二叉树的前序遍历

6. 二叉树的后序遍历

7. 对称二叉树


前言

        前面我们学习过了二叉树的相关知识点,那么今天我们就做做练习,下面我会介绍几道关于二叉树的leetcode习题,我们一起来看看吧!

二叉树相关链接:

二叉树的基本操作:数据结构-----二叉树的基本操作-CSDN博客

二叉树的创建和遍历:数据结构-----二叉树的创建和遍历-CSDN博客

二叉树的基础知识点:数据结构-----树和二叉树必知必会知识_Gretel Tade的博客-CSDN博客

堆的相关方法代码实现:数据结构-----堆(完全二叉树)-CSDN博客

1. 二叉树的中序遍历

 给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。

思路分析:

 这道题是这样要求的,给入一个int类型的指针num,要求去进行动态空间的分配为数组,然后去进行中序遍历二叉树节点,把得到的数据存入到这个数组里面去,最后输出这个数组,也就是说中序遍历的同时还会去拿到数据进行储存。

 代码实现:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */

void travel(struct TreeNode* root, int*num,int*returnSize){
        if(!root)
            return;
        travel(root->left,num,returnSize);
        num[*returnSize]=root->val;
        *returnSize+=1;
        travel(root->right,num,returnSize);
}
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* inorderTraversal(struct TreeNode* root, int* returnSize){
    int* num=(int*)malloc(sizeof(int)*100);
    *returnSize=0;
    if(!root)
        return NULL;
    travel(root,num,returnSize);
    return num;
        
}


2. 相同的树

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

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

思路分析:

 要判断是否相同的树,就要判断同一个位置的节点是否存在,存在的同时里面的值是否相同,那就分以下三种情况。第一:节点都不存在,那么这就是满足条件true;第二:一个节点存在一个不存在,那就是false;第三:里面的值不同,结果还是false。对以上的三种情况进行左子树和右子树遍历取和运算即可。

代码实现:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
bool isSameTree(struct TreeNode* p, struct TreeNode* q){
  
    if(!p&&!q)
        return true;
    if(!p||!q)
    return false;
    if(p->val!=q->val)
    return false;
    return isSameTree(p->left,q->left) && isSameTree(p->right,q->right);
}

3. 二叉树的最大深度

给定一个二叉树 root ,返回其最大深度。

二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。

思路分析:

获取最大深度,那就是每次向左右子树进行遍历,取每次遍历一层就进行深度+1,最后递归到根节点的时候,比较此时左右子树当前深度的大小,取其中大的一个返回即可。

 代码实现:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */


int maxDepth(struct TreeNode* root){
    if(!root){
        return 0;
    }
    int l=maxDepth(root->left);
    int r=maxDepth(root->right);
    if(l>r)
    return l+1;
    else
    return r+1;
}

4. 二叉树的最小深度

给定一个二叉树,找出其最小深度。

最小深度是从根节点到最近叶子节点的最短路径上的节点数量。

说明:叶子节点是指没有子节点的节点。

思路分析:

跟上面求最大深度不同,这里就要去分三种情况来讨论了,首先就是如果这个树只有右子树没有左子树,那么返回的值就是从右子树遍历的结果;如果只有左子树没有右子树,那么返回的深度也就是左子树遍历的结果,如果左右子树都有的话,那么返回的深度就是其中较小者的值。

代码实现:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
int minDepth(struct TreeNode* root){
    if(!root){
        return 0;
}
    else if(!root->left&&root->right)
        return minDepth(root->right)+1;
    else if(!root->right&&root->left)
        return minDepth(root->left)+1;
    else {
        int l=minDepth(root->left);
        int r= minDepth(root->right);
        if(l>r)
            return r+1;
        else
            return l+1;
    }
}


5.二叉树的前序遍历

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

思路分析:

跟中序遍历是一样的,先进行分配储存数据的数组空间,然后进入到前序遍历的过程中,一边储存数据,一边遍历,最后的遍历结果就是直接输出这个数组储存到的数据即可。

 代码实现:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
void travel(struct TreeNode* root, int *num,int* returnSize)
{
    if(!root)
        return;
    num[*returnSize]=root->val;
    *returnSize+=1;
    travel(root->left,num,returnSize);
    travel(root->right,num,returnSize);
}
int* preorderTraversal(struct TreeNode* root, int* returnSize){
  
    int* num=(int*)malloc(sizeof(int)*100);
    *returnSize=0;
    travel(root,num,returnSize);
    return num;
    
   
}


6. 二叉树的后序遍历

给你一棵二叉树的根节点 root ,返回其节点值的 后序遍历 。 

思路分析:

方法还是跟上面一样的,通过分配储存数据数组的空间来储存当前后序遍历的结果。

 代码实现:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */


/**
 * Note: The returned array must be malloced, assume caller calls free().
 */

 void travel(struct TreeNode* root, int *num,int* returnSize)
{
    if(!root)
        return;
    travel(root->left,num,returnSize);
    travel(root->right,num,returnSize);
    num[*returnSize]=root->val;
    *returnSize+=1;
}
int* postorderTraversal(struct TreeNode* root, int* returnSize){
 
    int *num=(int*)malloc(sizeof(int)*500);
    *returnSize=0;
    travel(root,num,returnSize);
    return num;
}


7. 对称二叉树

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

思路分析:

判断一个二叉树是否为对称二叉树也就是以根结点为对称轴进行划分比较,同样的分一些几种情况去讨论。1.如果此时对称位置的节点都为空,那么结果就是true;2.如果对称位置节点一个为空一个不为空,那结果就是false;3.如果对称位置节点的值不同,那结果也是false;4.最后就是如果对称位置的节点都存在而且里面的数据值也是相同的,那么就进行往下遍历,最后进行取和运算结果即可。

代码实现:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */

bool check(struct TreeNode* p,struct TreeNode* q){
    if(!p&&!q)
        return true;
    if(p==NULL||!q)
        return false;
    if(p->val!=q->val)
        return false;
    else
        return check(p->left,q->right)&&check(p->right,q->left);
}
bool isSymmetric(struct TreeNode* root){
    return check(root,root);
}

 好了,以上就是本期习题的全部内容了,我们下一期再见!

 分享一张壁纸:

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

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

相关文章

如何实现一个业务系统的自动化框架搭建

1、框架结构 我在该项目采用的是关键字驱动测试的框架类型。首先创建如下几个目录common(公共模块)、config(公共配置)、logs(运行日志)、reports(测试报告)、resources&#xff08…

前端的多种克隆方式和注意事项

克隆的意义和常见场景: 意义: 保证原数据的完整性和独立性常见场景: 复制数据, 函数入参, class构造函数等 浅克隆: 对象常用的浅克隆 es6扩展运算符...Object.assign 数组常用的浅克隆 es6的扩展运算符...slice>arr.slice(0)[].concat 深度克隆: 克隆对象的每个层级如…

YOLOv8改进算法之添加CA注意力机制

1. CA注意力机制 CA(Coordinate Attention)注意力机制是一种用于加强深度学习模型对输入数据的空间结构理解的注意力机制。CA 注意力机制的核心思想是引入坐标信息,以便模型可以更好地理解不同位置之间的关系。如下图: 1. 输入特…

【RocketMQ】【源码】Dledger日志复制源码分析

消息存储 在 【RocketMQ】消息的存储一文中提到,Broker收到消息后会调用CommitLog的asyncPutMessage方法写入消息,在DLedger模式下使用的是DLedgerCommitLog,进入asyncPutMessages方法,主要处理逻辑如下: 调用serial…

leetCode 122.买卖股票的最佳时机 II 动态规划 + 状态转移 + 状态压缩

122. 买卖股票的最佳时机 II - 力扣(LeetCode) 给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。 在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买&…

006:连续跌三天,第四天上涨的概率--用python统计

我们已经可以获取到K线信息了,然后我们来进行一些统计,就统计连续三天下跌,第四天上涨的概率。 我们用宁波银行(002142)最近三年的数据来统计。先用上一篇的程序下载到K线数据,得到文件002142.csv。然后在…

Spring修炼之旅(4)静态/动态代理模式与AOP

一、代理模式概述 代理模式 为什么要学习代理模式,因为AOP的底层机制就是动态代理! 代理模式: 静态代理 动态代理 学习aop之前 , 我们要先了解一下代理模式! 1.1静态代理 静态代理角色分析 抽象角色 : 一般使用接口或者抽象…

【数据结构练习】二叉树相关oj题集锦二

目录 前言 1.平衡二叉树 2.对称二叉树 3.二叉树遍历 4.层序遍历 5.判断一棵树是不是完全二叉树 前言 编程想要学的好,刷题少不了,我们不仅要多刷题,还要刷好题!为此我开启了一个弯道超车必做好题锦集的系列,此为…

2023/9/30 使用消息队列完成进程间通信

发送方 ​ #include <myhead.h> //消息结构体 typedef struct {long msgtype; //消息类型char data[1024]; //消息正文 }Msg_ds;#define SIZE sizeof(Msg_ds) - sizeof(long) //正文大小 int main(int argc, const char *argv[]) {//1.创建key值key_t key ;if((key …

中断向量控制器(NVIC)

1. 什么是中断 在处理器中&#xff0c;中断是一个过程&#xff0c;即CPU在正常执行程序的过程中&#xff0c;遇到外部/内部的紧急事件需要处理&#xff0c;暂时中止当前程序的执行&#xff0c;转而去为处理紧急的事件&#xff0c;待处理完毕后再返回被打断的程序处继续往下执行…

Spring MVC 中的国际化和本地化

Spring MVC 中的国际化和本地化 国际化&#xff08;Internationalization&#xff0c;简称i18n&#xff09;和本地化&#xff08;Localization&#xff0c;简称l10n&#xff09;是构建多语言应用程序的重要概念。Spring MVC提供了丰富的支持&#xff0c;使开发人员能够轻松地处…

Python 笔记06(Mysql数据库)

一 基础 1.1 安装 MySQL下载参考&#xff1a;MySQL8.0安装配置教程【超级详细图解】-CSDN博客 测试是否安装并正确配置环境变量&#xff1a; 1.2 查看服务器是否正常运行 1.3 显示数据库 show databases; 1.4 退出 exit 1.5 python 连接 1.6 查主机IP ipconfig

2.springboot代理调用

1.概述 本文介绍在方法上开启声明式事务Transactional后(使用InfrastructureAdvisorAutoProxyCreator创建jdk动态代理)&#xff0c;springboot的调用该方法的过程&#xff1b; 2.结论(重点) 在方法开启声明式事务后&#xff0c;spring会为该对象创建动态代理。spring容器为该…

Android Jetpack组件架构:ViewModel的原理

Android Jetpack组件架构&#xff1a;ViewModel的原理 导言 本篇文章是关于介绍ViewModel的&#xff0c;由于ViewModel的使用还是挺简单的&#xff0c;这里就不再介绍其的基本应用&#xff0c;我们主要来分析ViewModel的原理。 ViewModel的生命周期 众所周知&#xff0c;一般…

聚观早报 | 2024款小鹏P5全新发布;华为发布13.2英寸MatePad Pro

【聚观365】9月26日消息 2024款小鹏P5全新发布 华为发布13.2英寸MatePad Pro 特斯拉发布人形机器人最新进展 百川智能发布Baichuan2-53B 软件行业仍将人才供不应求 2024款小鹏P5全新发布 继2024款小鹏G9问世仅一周&#xff0c;小鹏汽车再度发力新产品&#xff0c;2024款小…

【小沐学前端】Node.js实现UDP通信

文章目录 1、简介2、下载和安装3、代码示例3.1 HTTP3.2 UDP单播3.4 UDP广播 结语 1、简介 Node.js 是一个开源的、跨平台的 JavaScript 运行时环境。 Node.js 是一个开源和跨平台的 JavaScript 运行时环境。 它是几乎任何类型项目的流行工具&#xff01; Node.js 在浏览器之外…

2.4g无线收发芯片:Ci24R1(DFN8)

Ci24R1 采用GFSK/FSK数字调制与解调技术。数据传输速率与PA输出功率都可以调节&#xff0c;支持2Mbps, 1Mbps, 250Kbps三种数据速率。高的数据速率可以在更短的时间完成同样的数据收发&#xff0c;因此可以具有更低的功耗。 Ci24R1 是一颗工作在2.4GHz ISM频段&#xff0c;专为…

医疗实施-住院流程详解

住院就诊流程详解 1.病人入院登记2.病人进入病区3.医生操作病人4.医嘱录入与审核执行5. 医嘱收费前在对应业务系统的操作5.1.药物医嘱5.2.检查检验医嘱5.3.手术医嘱 6.住院医嘱费用的产生7. 医嘱收费后在对应业务系统的操作8. 病人出院 这篇文章是基于我的文章《医疗实施-住院就…

8.3Jmeter使用json提取器提取数组值并循环(循环控制器)遍历使用

Jmeter使用json提取器提取数组值并循环遍历使用 响应返回值例如&#xff1a; {"code":0,"data":{"totalCount":11,"pageSize":100,"totalPage":1,"currPage":1,"list":[{"structuredId":&q…

[React] 性能优化相关

文章目录 1.React.memo2.useMemo3.useCallback4.useTransition5.useDeferredValue 1.React.memo 当父组件被重新渲染的时候&#xff0c;也会触发子组件的重新渲染&#xff0c;这样就多出了无意义的性能开销。如果子组件的状态没有发生变化&#xff0c;则子组件是不需要被重新渲…