【数据结构】二叉树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://xiahunao.cn/news/2870042.html

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

相关文章

android studio 连接mumu模拟器调试

1、打开mumu模拟器 2、在Android Studio 中 控制台 cd 到 sdk 目录下 platform-tools 文件夹,有一个adb.exe 可运行程序 一般指令: adb connect 127.0.0.1:7555 但是这个执行在window环境下可能会报错 解决方法是在 adb 之前加 ".\", 问题…

nRF52832——内部温度传感器与随机数产生

nRF52832——内部温度传感器与随机数产生 内部温度传感器温度传感寄存器温度传感器电气特征温度传感器库函数编程 随机数产生器随机数发生器寄存器随机数发生器库函数编程库函数使用流程RNG 工程搭建使用 内部温度传感器 在 nrf52xx 系列芯片内部,包含一个内部温度…

IDEA创建Sping项目只能勾选17和21,没有Java8?

解决办法: 替换创建项目的源 我们只知道IDEA页面创建Spring项目,其实是访问spring initializr去创建项目。故我们可以通过阿里云国服去间接创建Spring项目。将https://start.spring.io/或者http://start.springboot.io/替换为 https://start.aliyun.com/

使用 Python 编写程序保护您的眼睛

眼睛,是心灵的窗户,生活在数字时代的我们,眼睛首当其冲地承受冲击。盯着电脑屏幕成为我们日常工作和学习的一部分,导致用眼过度。那如何减少对眼睛的伤害,应该如何保护眼睛? 用眼应控制时间,自…

C语言字符函数和字符串函数详解

Hello, 大家好,我是一代,今天给大家带来有关字符函数和字符串函数的有关知识 所属专栏:C语言 创作不易,望得到各位佬们的互三呦 一.字符函数 在C语言中有一些函数是专门为字符设计的,这些函数的使用都需要包含一个头文…

如何用人工智能实现客户服务营销?实用指南与关键技巧一网打尽

在不断发展的营销领域,创意是成功营销活动的生命线。火花点燃兴趣,吸引受众,推动参与。但是,如果有一种方法可以利用技术来提升创意,那会怎样呢?生成式人工智能(Generative AI)是一种…

数据结构与算法----复习Part 16 (并查集)

本系列是算法通关手册LeeCode的学习笔记 算法通关手册(LeetCode) | 算法通关手册(LeetCode) (itcharge.cn) 目录 并查集(Union Find) 基于数组实现的快速查询并查集 基于森林实现的快速合并并查集 路径…

51单片机-AT24C02(I2C总线)

目录 一,介绍及元件工作原理 7.时序结构(重要) 8.i2C总线数据帧(重要) 二,应用 一,介绍及元件工作原理 1.元件介绍 2.存储器 3.地址总线和数据总线 地址总线只能一次选中一行 4.引脚及应用…

三次握手seq和ack的流程 TCP协议栈seq和ack深层理解

☆ 大家可以把想了解的问题在评论发给我?我会根据问题补充到后面 ☆ 三次握手seq和ack的流程 是的,在TCP/IP协议中,三次握手过程确实涉及到序列号(Sequence Number, 简称Seq)和确认号(Acknowledgment Number, 简称Ack)的交换。这个过程是为了建立可靠的连接,确保数据能…

Python基础(七)之数值类型字典

Python基础(七)之数值类型字典 1、简介 字典(dict),Dictionary:是一种可变类型,可以存储任意类型的元素,如列表、字符串、元组等。 字典是无序的,所以不支持索引和切片。字典以键值…

CSS中如何设置单行或多行内容超出后,显示省略号

1. 设置超出显示省略号 css设置超出显示省略号可分两种情况: 单行文本溢出显示省略号…多行文本溢出显示省略号… 但使用的核心代码是一样的:需要先使用 overflow:hidden;来把超出的部分隐藏,然后使用text-overflow:ellipsis;当文本超出时…

软考 系统架构设计师之回归及知识点回顾(7)

接前一篇文章:软考 系统架构设计师之回归及知识点回顾(6) 11. 云计算 背景 大数据和云计算已成为IT领域的两种主流技术。“数据是重要资产”这一概念已成为大家的共识,众多公司争相分析、挖掘大数据背后的重要财富。同时学术界、…

哔哩哔哩后端Java一面

前言 作者:晓宜 个人简介:互联网大厂Java准入职,阿里云专家博主,csdn后端优质创作者,算法爱好者 最近各大公司的春招和实习招聘都开始了,这里分享下去年面试B站的的一些问题,希望对大家有所帮助…

第十二届蓝桥杯EDA省赛真题分析

前言: 第十二届蓝桥杯EDA比赛用的是AD软件,从第十四届起都是使用嘉立创EDA专业版,所以在这里我用嘉立创EDA专业版实现题目要求。 一、省赛第一套真题题目 主观题整套题目如下: 试题一:库文件设计(5分&am…

VS Code 配置类似浏览器中的垂直标签页功能

参考:Dominik Weber - 2022.06.25 (注:原文中的配置有些过时了,所以根据 VS Code 的最新版本进行了调整。) 原作者非常喜欢垂直标签页,只要有可能,就都会使用它们。他主要在浏览器(Firefox)和…

Python之Web开发中级教程----ubuntu中下载安装Postman

Python之Web开发中级教程----ubuntu中下载安装Postman PostMan 是一款功能强大的网页调试与发送网页 HTTP 请求的 Chrome 插件,可以直接去对我们写出来的路由和视图函数进行调试,作为后端程序员是必须要知道的一个工具。 查看ubuntu系统中是否已经安装了…

VsCode 配置go开发环境之下载go tools

ctrl shift P 选择 go install/update tools,下载go tools 报错, 提升dial err。 将GOPROXY 和 GOSUMDB 按照如下配置,重启IDE即可成功下载 set GOPROXYhttps://goproxy.cn set GOSUMDBoff

程序人生——Java多线程和并发的使用建议

目录 引出多线程和并发建议118:不推荐覆写start方法建议119:启动线程前stop方法是不可靠的建议120:不适用stop方法停止线程 建议121:线程优先级只使用三个等级建议122:使用线程异常处理器提升系统可靠性建议123&#x…

【递归专题】【蓝桥杯备考训练】:有序分数、正则问题、带分数、约数之和、分形之城【已更新完成】

目录 1、有序分数(usaco training 2.1) 2、正则问题(第八届蓝桥杯省赛C A组 & Java A组) 3、带分数(第四届蓝桥杯省赛Java A组/B组 & C B组/C组) 4、约数之和(《算法竞赛进阶指南》…

jvm的垃圾回收器以及触发full gc的场景

JVM(Java虚拟机)的垃圾回收器有很多种,主要包括以下几种: Serial收集器:串行收集器是最古老、最稳定的收集器。它使用单个线程进行垃圾收集工作,在进行垃圾回收时会暂停所有用户线程。 ParNew收集器&#…