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

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

相关文章

个人网站制作 Part 9 | Web开发项目

文章目录 个人网站制作 Part 9 | Web开发项目👩‍💻 基础Web开发练手项目系列:个人网站制作🚀 添加博客功能🔨使用Express和MongoDB🔧步骤 1: 创建博客模型🔧步骤 2: 创建博客路由 &#x1f528…

PCM和I2S区别

I2S和PCM接口都是数字音频接口,而所见的蓝牙到cpu以及codec的音频接口都是用PCM接口,是不是两个接口有各自不同的应用呢?先来看下概念。 PCM(PCM-clock、PCM-sync、PCM-in、PCM-out)脉冲编码调制,模拟语音信…

BitMap位图理解及典型应用案例

基本介绍 本质上是哈希表的一种应用实现,原理简单,以 bit 为单位构建数组的方案,就叫作 Bitmap,翻译为位图。即bit 的集合;使用一个bit表示状态, 两种状态 (0不存在和1存在) 使用最少字节的类型…

【蓝桥杯嵌入式】四、各种外设驱动(六)生成PWM波——呼吸灯

温馨提示:本文不会重复之前提到的内容,如需查看,请参考附录 【蓝桥杯嵌入式】附录 目录 理论知识: 一、需求分析 1、需要的外设资源分析: 2、外设具体分析: 3、软件分析: 二、软件配置 …

Windows11企业版安装WSL2和Ubuntu发布版(避坑)

背景 win10企业版升级win11企业版后,安装WSL2,最后安装WSL的Ubuntu发布版,尝试网上各种方法,还是出现文章第三节所写的问题,差点被这问题搞放弃了,全网少有针对这个问题的答案,有也不顶用&…

开源漏扫工具:DependencyCheck

开源漏扫工具:DependencyCheck Dependency-Check 是 OWASP(Open Web Application Security Project)的一个实用开源程序,用于识别项目依赖项并检查是否存在任何已知的,公开披露的漏洞。 DependencyCheck是一个开源的…

景联文科技:提供通用多模态数据,助力AI多模态领域实现飞跃式发展

回顾2023年,以ChatGPT为代表的通用人工智能大模型在全球范围内掀起了新一轮人工智能产业发展浪潮,我国人工智能大模型市场呈现百“模”争鸣、日新月异的迅猛发展态势。 根据大模型之家、钛媒体数据,2023年中国大模型市场规模达到147亿人民币&…

《古滇传说水龙吟》反派敖诀

2024年2月28日,演员李亚云参演新剧古滇传说原创系列剧第一部《水龙吟》在浙江横店影视城开机拍摄。该剧由中共昆明市西山区委宣传部、石林县委宣传部、昆明滇池国家旅游度假区管委会文旅投促局、云南民族电影制片厂、云南卫视、昆明影视拍摄服务中心支持&#xff0c…

如何在CasaOS系统玩客云中安装内网穿透工具实现远程访问内网主机下载资源

文章目录 1. CasaOS系统介绍2. 内网穿透安装3. 创建远程连接公网地址4. 创建固定公网地址远程访问 2月底,玩客云APP正式停止运营,不再提供上传、云添加功能。3月初,有用户进行了测试,局域网内的各种服务还能继续使用,但…

T01.springboot入门

1.第一步: 2.第二步: 添加后,再启动一下

Python-GIS分析之地理数据空间聚类

地理空间数据聚类是空间分析和地理信息系统(GIS)领域的一项关键技术。这种方法对于理解地理数据固有的空间模式和结构、促进城市规划、环境管理、交通和公共卫生等各个领域的决策过程至关重要。本文探讨了地理空间数据聚类的概念、方法、应用、挑战和未来方向。 当模式出现…

cdn尝试(减少打包体积)

如果是vue-cli创造的工程,在build后面加上 --report,就会在dist文件夹下出现report.html用于分析打包后个文件的体积 也可以使用插件: webpack使用webpack-bundle-analyzer进行分析; vite使用rollup-plugin-visualizer进行分析…