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

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

相关文章

力扣209. 长度最小的子数组

思路:题目是 数组和 > target,不是等于target 双指针法:用for循环中的 r 来界定右边界的下标,右边界每移动一位,左边界可能需要移动多位,所以内部再用while, 当满足 数组和>target时,记录…

知识蒸馏Matching logits与RocketQAv2

知识蒸馏Matching logits 公式推导 刚开始的怎么来,可以转看下面证明梯度等于输出值-标签y C是一个交叉熵,我们要求解的是这个交叉熵对的这个梯度。就是你可以理解成第个类别的得分。就是student model,被蒸馏的模型,它所输出的…

Java两周半速成之路(第十六天)

一、网络编程 1.概述: 就是用来实现网络互连的不同计算机上运行的程序间可以进行数据交换 2.网络模型 3.网络参考模型图 4.网络通信三要素 4.1IP地址 InetAddress类的使用: 注意:通过API查看,此类没有构造方法,如…

Docker 哲学 - 容器操作

容器: 创建 停止 删除 强制删除(正在运行) run stop rm rm -f 列出本地容器: docker ps / docker container ls 镜像: search pull run : …

第十四届蓝桥杯省赛真题 Java A 组【原卷】

文章目录 发现宝藏【考生须知】试题 A \mathrm{A} A : 特殊日期试题 B: 与或异或试题 C : \mathrm{C}: C: 平均试题 D: 棋盘试题 E : \mathrm{E}: E: 互质数的个数试题 F: 阶乘的和试题 G: 小蓝的旅行计划试题 H: 太阳试题 I: 高塔试题 J \mathrm{J} J : 反异或 01 串 发现…

代码随想录 Day45 动态规划(背包问题)

对背包问题有了更深刻的理解,物品的遍历是背包可能要装的物品的遍历,跟多少数量有关系,而背包的遍历则跟物品的重量,背包的容量,以及价值有关。

C语言数据结构易错知识点(3)(堆)

1.堆的本质:完全二叉树 堆在物理结构上是顺序结构,实现方式类似于顺序表(数组);但在逻辑结构上是树形结构,准确来说堆是一棵完全二叉树。因为堆的实现在代码上和顺序表有很高的相似度,所以在写…

关于用max,min函数超时的情况—算法小Tips

今天在做这道题的时候,有了一点对一些题max函数min函数就会超时的思考,不是每道题都这样,但也可以是个做题小tips; 题目连接:登录—专业IT笔试面试备考平台_牛客网 题目很简单,用个前缀和暴力一下就行&…

【Preprocessing数据预处理】之Scaler

在机器学习中,特征缩放是训练模型前数据预处理阶段的一个关键步骤。不同的缩放器被用来规范化或标准化特征。这里简要概述了您提到的几种缩放器: StandardScaler StandardScaler 通过去除均值并缩放至单位方差来标准化特征。这种缩放器假设特征分布是正…

C语言从入门到熟悉------第四阶段

指针 地址和指针的概念 要明白什么是指针,必须先要弄清楚数据在内存中是如何存储的,又是如何被读取的。如果在程序中定义了一个变量,在对程序进行编译时,系统就会为这个变量分配内存单元。编译系统根据程序中定义的变量类型分配…

深度学习 精选笔记(11)深度学习计算相关:GPU、参数、读写、块

学习参考: 动手学深度学习2.0Deep-Learning-with-TensorFlow-bookpytorchlightning ①如有冒犯、请联系侵删。 ②已写完的笔记文章会不定时一直修订修改(删、改、增),以达到集多方教程的精华于一文的目的。 ③非常推荐上面(学习参考&#x…

C++ 入门篇

目录 1、了解C 2、C关键字 2、命名空间 2.1 命名空间的定义 2.2 命名空间的使用 3. C输入与输出 4.缺省参数 4.1 缺省参数的概念 4.2 缺省参数的分类 5. 函数重载 5.1 函数重载的概念 5.2 C中支持函数重载的原理--名字修饰 6. 引用 6.1 引用概念 6.2 引用…

HTML案例-2.标签综合练习

目录 效果 知识点 1.图像标签 2.链接标签 3.锚点定位 4.base标签 源码 页面1 页面2 效果 知识点 1.图像标签 <img src="图像URL" /> 单标签 属性 属性值 描述 src URL 图像的路径 alt 文本

Linux使用Docker部署Registry结合内网穿透实现公网远程拉取推送镜像

文章目录 1. 部署Docker Registry2. 本地测试推送镜像3. Linux 安装cpolar4. 配置Docker Registry公网访问地址5. 公网远程推送Docker Registry6. 固定Docker Registry公网地址 Docker Registry 本地镜像仓库,简单几步结合cpolar内网穿透工具实现远程pull or push (拉取和推送)…

0G联合创始人MICHAEL HEINRICH确认出席Hack.Summit() 2024区块链开发者大会

随着区块链技术的不断发展和应用&#xff0c;全球开发者瞩目的Hack.Summit() 2024区块链开发者大会即将于2024年4月9日至10日在香港数码港盛大举行。此次大会由Hack VC主办&#xff0c;并得到AltLayer和Berachain的协办&#xff0c;同时汇聚了Solana、The Graph、Blockchain Ac…

路由和流量控制

项目拓扑与项目需求 项目需求:某政务网络拥有两个园区&#xff0c;园区A和园区B之间通过物理专线相连。IP地址如图所示。现在需要实现以下需求&#xff1a; 要求A园区无法访问B园区的vlan 30 网络&#xff0c;要求使用路由过滤的方式实现。 配置步骤 设备IP地址的规划 设备名…

从0开始回顾MySQL---事务四大特性

事务概述 事务是一个最小的工作单元。在数据库当中&#xff0c;事务表示一件完整的事儿。一个业务的完成可能需要多条DML语句共同配合才能完成&#xff0c;例如转账业务&#xff0c;需要执行两条DML语句&#xff0c;先更新张三账户的余额&#xff0c;再更新李四账户的余额&…

螺旋阵思维与代码

1.思维 56789419202110318252211217242312116151413观察上面的螺旋阵,你就会发现数字从小到大,按照贝壳的螺旋形依次排列. 走到头就要换一个方向. 看到螺旋数组可以让人想象到贪吃蛇,拿出一个字符串设置为方向,碰到头方向改变,这样循环模拟,直到格子里的数>行和列数(n) .…

c++ 常用函数 集锦 整理中

c 常用函数集锦 目录 c 常用函数集锦 1、string和wstring之间转换 2、经纬度转 xyz 值 互转 3 、获取 根目录下的文件地址 1、string和wstring之间转换 std::string convertWStringToString(std::wstring wstr) {std::string str;if (!wstr.empty()){std::wstring_convert<…

51-31 VastGaussian,3D高斯大型场景重建

2024 年 2 月&#xff0c;清华大学、华为和中科院联合发布的 VastGaussian 模型&#xff0c;实现了基于 3D Gaussian Splatting 进行大型场景高保真重建和实时渲染。 Abstract 现有基于NeRF大型场景重建方法&#xff0c;往往在视觉质量和渲染速度方面存在局限性。虽然最近 3D…