【数据结构】二叉树OJ题(C语言实现)

请添加图片描述

✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿
🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟
🌟🌟 追风赶月莫停留 🌟🌟
🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀
🌟🌟 平芜尽处是春山🌟🌟
🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟
🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅

📝数据结构OJ题

  • ✏️单值二叉树
  • ✏️相同的树
  • ✏️二叉树前序遍历
  • ✏️二叉树中序遍历
  • ✏️二叉树后序遍历

✏️单值二叉树

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

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

本题写法中,我们主要利用递归的思想和等号的性质从反向入手,也就是说只要有不相等就返回false。

上面说的等号的性质就是a=b,b=c那么a就一定等于c了。

如果从正向入手就有点麻烦,你判断了他们相等还要一个个的递归。大家可以去试一试。

当然还有一个最终要的条件判断,比较是在左子树和右子树都存在的情况下,如果不存在就不用比较,所以我在比较前都加了一个判断,判断root->left和root->right都存在,才去比较。

✏️相同的树

在这里插入图片描述

在这里插入图片描述


class Solution {
public:bool isSameTree(TreeNode* p, 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) ;}
};

上图是正确写法,还有一种常见的错误写法,下图是错误写法:


class Solution {
public:bool isSameTree(TreeNode* p, TreeNode* q) {if (p == NULL && q == NULL)return true ;else{return false ;}if (p->val != q->val)return false ;return isSameTree(p->left, q->left)&&     isSameTree(p->right, q->right) ;}
};

两者最大的一个区别就是第一个判断哪里:

在这里插入图片描述
在这里插入图片描述
正确的写法是单独写了一个if来判断其中有一个为空,也就是有两种情况。要么是p为空,q不为空。要么就是p不为空,q为空。

错误的写法就是直接用了else,而这else包含了三种情况,比正确写法多包含了一种写法,就是两者都不为空的情况。

原本两者都不为空,才来比较,而错误写法中直接返回false了。

✏️二叉树前序遍历

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

//计算节点个数
int TreeSize(struct TreeNode *root)
{if (root == NULL)return 0 ;return TreeSize(root->left) + TreeSize(root->right) + 1;
}//进行前序遍历
void preorder(struct TreeNode *root, int *a, int *i)
{if (root  == NULL)return ;a[(*i)++] = root->val ;preorder(root->left, a, i) ;preorder(root->right, a, i) ;
}int* preorderTraversal(struct TreeNode* root, int* returnSize) 
{int n = TreeSize(root) ;int *a = (int *)malloc(sizeof(int)*n) ;int j = 0 ;preorder(root, a, &j) ;*returnSize = n ;return a ;
}

首先题目给出的:
在这里插入图片描述
这个可以简单理解为这个前序遍历所需要空间的大小,并不是系统提供的数组,系统内部有提供的有遍历所存放的数组,传过来的不是数组的地址,因为这是一级指针,改变不了系统所给数组里的数据,大家以后再遇到类似这个的时候都可以这样理解,所以我们开头就求了遍历所需要的空间大小:

在这里插入图片描述

在这里插入图片描述

以及在结尾,我又传给了returnSize。

在这里插入图片描述

关于为什么这里传地址:

在这里插入图片描述
这是因为,这里的j是记录数组里面存放数据个数的,而我们这里前序遍历是利用递归实现的,而形参改变不了实参的大小,所以这里我传地址过去。

在这里进行前序遍历,我重新写了一个函数来实现:

在这里插入图片描述
前序遍历就是先执行根,然后左子树,最后右子树。

✏️二叉树中序遍历

//计算节点个数
int TreeSize(struct TreeNode *root)
{if (root == NULL)return 0 ;return TreeSize(root->left) + TreeSize(root->right) + 1;
}//进行中序遍历
void inorder(struct TreeNode *root, int *a, int *i)
{if (root  == NULL)return ;inorder(root->left, a, i) ;a[(*i)++] = root->val ;inorder(root->right, a, i) ;
}int* inorderTraversal(struct TreeNode* root, int* returnSize) 
{int n = TreeSize(root) ;int *a = (int *)malloc(sizeof(int)*n) ;int j = 0 ;inorder(root, a, &j) ;*returnSize = n ;return a ;
}

这里的中序遍历几乎和前序遍历一样,只是在递归的时候先递归左子树,然后赋值,最后递归右子树:

在这里插入图片描述

在这里插入图片描述
大家可以比较一下。

✏️二叉树后序遍历

//计算节点个数
int TreeSize(struct TreeNode *root)
{if (root == NULL)return 0 ;return TreeSize(root->left) + TreeSize(root->right) + 1;
}//进行后序遍历
void postorder(struct TreeNode *root, int *a, int *i)
{if (root  == NULL)return ;postorder(root->left, a, i) ;postorder(root->right, a, i) ;a[(*i)++] = root->val ;
}int* postorderTraversal(struct TreeNode* root, int* returnSize) 
{int n = TreeSize(root) ;int *a = (int *)malloc(sizeof(int)*n) ;int j = 0 ;postorder(root, a, &j) ;*returnSize = n ;return a ;    
}

大家可以仔细比较下,前中后序遍历的情况。

如果有错误,欢迎大家指针哈,我们一起学习进步!!!!!!

请添加图片描述

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

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

相关文章

【C#】int+null=null

C#语法,这玩意不报错 intnullnull,有点不合逻辑 (Int32)(bizRepair0rder.CreateTime. Value - regues.Mlodifylime.Value).TotalMinutes (Int32)(bizRepair0rder.CreateTime. Value - reques.llodifylime.Value).TotalMinutes nullstring是引用类型&…

机器学习-04-分类算法-03KNN算法

总结 本系列是机器学习课程的系列课程,主要介绍机器学习中分类算法,本篇为分类算法与knn算法部分。 本门课程的目标 完成一个特定行业的算法应用全过程: 懂业务会选择合适的算法数据处理算法训练算法调优算法融合 算法评估持续调优工程化…

冲动是魔鬼,工作不顺心时不要把坏脾气带给家人

今天与一个跟踪了很久的客户准备签合同了,客户突然反悔,为此与他周旋了一整天,忙碌得一口水都没有喝。回到小区坐在车里抽着烟,久久不愿回家,只想一个人坐着,疲惫、无奈。这个月的奖金似乎又将成为泡影。 …

AI - 决策树模型

🤔决策树算法 决策树的思想来源可以追溯到古希腊时期,当时的哲学家们就已经开始使用类似于决策树的图形来表示逻辑推理过程。然而,决策树作为一种科学的决策分析工具,其发展主要发生在20世纪。 在20世纪50年代,美国兰…

Machine Vision Technology:Lecture5 Local feature:Corners角点

Machine Vision Technology:Lecture5 Local feature:Corners角点 Motivation:panorama stitching全景图拼接提取良好特征Feature points applications特征点应用Finding Corners找角点Corner Detection:Basic Idea角点检测基本思想…

【数据结构和算法初阶(C语言)】队列实操(概念实现+oj题目栈和队列的双向实现以及循环链表难点题目详解!)

目录 1. 队列的概念及结构 2.队列结构存在的意义应用 3.队列实现的结构选择 4.队列实现 5.队列对数据的处理 5.1队列初始化 5.2队尾入数据 5.3队头出数据 5.4获取队列尾部元素 5.5获取队列头部元素 5.6获取队列中元素个数 5.7检测队列是否为空 5.8销毁队列 6.循环队列补充 7.使…

【AcWing】蓝桥杯集训每日一题Day5|归并排序|离散化|二分|逆序数对|505.火柴排队(C++)

火柴排队 505. 火柴排队 - AcWing题库难度:中等时/空限制:1s / 128MB总通过数:2058总尝试数:4484来源:NOIP2013提高组算法标签贪心离散化树状数组归并排序 题目内容 涵涵有两盒火柴,每盒装有 n 根火柴…

广度优先算法(一篇文章讲透)

目录 引言 一、算法概述 二、算法步骤 1 初始化 2 循环处理 三、算法应用 1 图的最短路径问题 2 网络爬虫 3 社交网络分析 4 游戏路径搜索 事例 四、算法特点与性能 五、性能优化 1 剪枝策略: 2 使用高效的数据结构: 3 并行化处理&#…

qt vs 编程 字符编码 程序从源码到编译到显示过程中存在的字符编码及隐藏的字符编码转换

理解字符编码,请参考:unicode ucs2 utf16 utf8 ansi GBK GB2312 CSDN博客 了解windows字符显示必须了解locale概念 参考:揭密 Windows 上的各种 locale - 知乎 汉字(或者说多字节字符)的存放需求,是计算…

理解数学概念——同伦和简单连通域

1. 同伦(homotopy) 1.1 homotopy[hɒməʊˈtɒpi] n. (1) <<The Oxford English Dictionary>>第二版&#xff1a; [数学专用术语&#xff0c;这个词由德语homotopie改造而来&#xff0c;(Dehn & Heegaard Analysis Situs in Encykl.d.math.Wiss.(1907) I…

【滤波专题-第8篇】ICA降噪方法——类EMD联合ICA降噪及MATLAB代码实现(以VMD-ICA为例)

今天来介绍一种效果颇为不错的降噪方法。&#xff08;针对高频白噪声&#xff09; 上一篇文章我们讲到了FastICA方法。在现实世界的许多情况下&#xff0c;噪声往往接近高斯分布&#xff0c;而有用的信号&#xff08;如语音、图像特征等&#xff09;往往表现出非高斯的特性。F…

测试环境搭建整套大数据系统(十一:docker部署superset,无密码登录嵌入html,http改为https)

一&#xff1a;安装docker 参考文档 https://blog.csdn.net/weixin_43446246/article/details/136554243 二&#xff1a;安装superset 下载镜像。 拉取镜像&#xff08;docker pull amancevice/superset&#xff09; 查看镜像是否下载完成&#xff08;docker images&#xf…

如何检测无源晶振过驱?晶振过驱怎么办?

无源晶振(Passive Crystal Oscillator)是一种使用晶体元件来生成稳定频率的振荡器&#xff0c;它不像有源振荡器(如时钟芯片)那样需要外部电源。检测无源晶振是否过驱通常需要通过测量其输出波形和频率&#xff0c;与期望的规格进行比较。 如何检测无源晶振过驱&#xff1a; …

Linux——线程池

线程池的概念 线程池也是一种池化技术&#xff0c;可以预先申请一批线程&#xff0c;当我们后续有任务的时候就可以直接用&#xff0c;这本质上是一种空间换时间的策略。 如果有任务来的时候再创建线程&#xff0c;那成本又要提高&#xff0c;又要初始化&#xff0c;又要创建数…

Gatling压力测试Springboot项目

Gatling压力测试Springboot项目 一、指定Java Spring 项目作为测试项二、下载Gatling三、配置测试代码四、打开bin目录下的gatling.bat文件进行测试 一、指定Java Spring 项目作为测试项 这里给出一个简单的示例&#xff1a;代码链接 下载maven依赖以后在8080端口运行这个项目…

Windows10+tensorrt+python部署yolov5

一、安装cuda 打开NVIDIA控制面板 —>帮助—>系统信息—>组件&#xff0c;找到驱动版本新&#xff0c;我这边是11.2&#xff0c; 然后去CUDA Toolkit Archive | NVIDIA Developer下载对应版本的CUDA&#xff0c;根据查看的CUDA型号确定对应的cuda Toolhit版本&#…

分析基于解析物理模型的E模式p沟道GaN高电子迁移率晶体管(H-FETs)

来源&#xff1a;Analyzing E-Mode p-Channel GaN H-FETs Using an Analytic Physics-Based Compact Mode&#xff08;TED 24年&#xff09; 摘要 随着近期对用于GaN互补技术集成电路&#xff08;ICs&#xff09;开发的p沟道GaN器件研究兴趣的激增&#xff0c;一套全面的模型…

初识Spring MVC

什么是Spring MVC? 官方给的解释是 Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架&#xff0c;从⼀开始就包含在 Spring 框架中。它的 正式名称“Spring Web MVC”来⾃其源模块的名称(Spring-webmvc)&#xff0c;但它通常被称为"Spring MVC" 注:Severlet是…

DragDiffusion的Win10部署方案

DragDiffusion就不再过多介绍。这是之前的一个Win10部署工作。文章链接这里就不贴了。 源代码 直接上Win10改好的程序下载链接&#xff1a;CSDN下载 Github我没有上传&#xff0c;因为实在是太大了。。。 接下来&#xff0c;您需要下载好上述文件&#xff0c;同时您需要去G…

【技术类-04】python实现docx表格文字和段落文字的“手动换行符(软回车)”变成“段落标记(硬回车)”

作品展示&#xff1a; 背景需求&#xff1a; 把python实现docx表格文字和段落文字的“手动换行符&#xff08;软回车&#xff09;”变成“段落标记&#xff08;硬回车&#xff09;合并在一起统计数量 【技术类-02】python实现docx段落文字的“手动换行符&#xff08;软回车&a…