【二叉树】oj题

在处理oj题之前我们需要先处理一下之前遗留的问题

在二叉树中寻找为x的节点

BTNode* BinaryTreeFind(BTNode* root, int x)
{
	if (root == NULL)
		return NULL;
	if (root->data == x)
	
		return root;
	BTNode* ret1 = BinaryTreeFind(root->left, x);
	BTNode* ret2 = BinaryTreeFind(root->right, x);
	if (ret1)
	    return ret1;
	if (ret2)
		return ret2;
	return NULL;

}

递归图
在这里插入图片描述
分别用ret1,ret2指针记录左子树,右子树的返回值,如果在左子树找到就会返回一个地址,用ret1记录指针,使得ret1不为空,此时会递归返回上一层,在上一层中进入if(ret1)条件判断语句中,返回节点为x的地址到上一层,一直到整棵树的根节点.同理ret2不为空也一样.
在这里插入图片描述

#单值二叉树

题目描述
在这里插入图片描述
代码

bool isUnivalTree(struct TreeNode* root) {
    if(root==NULL)
    return true;
    if(root->left&&root->left->val!=root->val)
    return false;
    if(root->right&&root->right->val!=root->val)
    return false;
    return isUnivalTree(root->left)&&isUnivalTree(root->right);  

    
}

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

当根和左右子树都相等的时候,就会一直递归左右子树,左右子树分别做根节点,和他的左右子树判断是否相等,当递归到叶子结点的左树,右树时,两个都会返回1,右侧中间的1,的左子树为空,右子树为1,左子树为空将会返回1,右子树为根,他的左右子树为空,返回1,树的根节点的左右子树返回两个1相与得到1,如此就可以判断得到结果,具体见上面的递归图.
#对称二叉树
题目描述
在这里插入图片描述
代码

  bool _isSymmetric(struct TreeNode* leftroot,struct TreeNode* rightroot) 
 {if(leftroot==NULL&&rightroot==NULL)
   return true;
   if(leftroot==NULL||rightroot==NULL)
   return false;
   if(leftroot->val!=rightroot->val)
   return false;
   return _isSymmetric(leftroot->left,rightroot->right)&&_isSymmetric(leftroot->right,rightroot->left); 
}
bool isSymmetric(struct TreeNode* root) {
return  _isSymmetric(root->left,root->right);    
} 

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

#二叉树的前序遍历
在这里插入图片描述
代码

 int BinaryTreeSize(struct TreeNode* root)
{

	return root == NULL ? 0 : BinaryTreeSize(root->left) + BinaryTreeSize(root->right) + 1;




}
void aapreorderTraversal(struct TreeNode*root,int*a,int i)
{if(root==NULL)
  return ;
  a[i++]=root->val;
  aapreorderTraversal(root->left,a,i);
  aapreorderTraversal(root->right,a,i);
}


int* preorderTraversal(struct TreeNode* root, int* returnSize) {
    *returnSize=BinaryTreeSize(root);
    int*a=(int*)malloc(*returnSize*sizeof(int));
    int i=0;
    aapreorderTraversal(root,a,i);
    return a;
}

注意上述代码有些问题,我先来解释一下代码,然后在解决上述问题,
之前我们写过前序遍历,但是这个题不同的是需要将前序遍历的结果放到一个数组中并且返回这个数组,首先我们解决的问题是二叉树结点的个数问题,因为要创建同大小的数组,这里我们就需要使用求二叉树结点个数的函数,返回的结点个数用returnsize接收,
在这里插入图片描述
并且该数组需要自己创建,
在这里插入图片描述
如果在这个函数里面采用前序遍历的话,每次递归都会malloc,所以我们使用另一个函数来递归前序遍历,
在这里插入图片描述
在这里插入图片描述
给递归前序遍历函数传的参数分别有要遍历二叉树的根的地址,malloc来的数组首地址,以及数组的下标,具体的前序遍历在二叉树那一篇文章中有详细的解释,现在讲一下存在的问题
在这里插入图片描述
在这里插入图片描述
当进入数据为2的栈帧此时的i还是1,就会覆盖掉数据为1的栈帧写入a[1]=1;
现在的a[1]=2;由于在二叉树结点个数中已经知道有三个结点,于是就会将
(a+2)里面的随机值打印出来,具体解决办法,传下标的地址过去,用指针接收.
代码

 int BinaryTreeSize(struct TreeNode* root)
{

	return root == NULL ? 0 : BinaryTreeSize(root->left) + BinaryTreeSize(root->right) + 1;




}
void aapreorderTraversal(struct TreeNode*root,int*a,int* pi)
{if(root==NULL)
  return ;
  a[(*pi)++]=root->val;
  aapreorderTraversal(root->left,a,pi);
  aapreorderTraversal(root->right,a,pi);
}


int* preorderTraversal(struct TreeNode* root, int* returnSize) {
    *returnSize=BinaryTreeSize(root);
    int*a=(int*)malloc(*returnSize*sizeof(int));
    int i=0;
    aapreorderTraversal(root,a,&i);
    return a;
}

#中序遍历
#后序遍历
这两个只需要修改位置即可
在这里插入图片描述
#另一颗子树
题目描述
在这里插入图片描述
代码实现

bool isSameTree(struct TreeNode* p, struct 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);
}
bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot){
if(root==NULL)
return false;
if(isSameTree(root, subRoot))
return true;
return isSubtree(root->left, subRoot)||isSubtree(root->right, subRoot);
}

这里用到了相同的树的函数

bool isSameTree(struct TreeNode* p, struct 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);
}

递归二叉树,分别以当前结点做根,与subRoot做比较,如果不同,就递归左右子树,如果左右子树中有与subroot为根的树相同的子树,就返回1,当根相同时,会调用函数isSameTree(struct TreeNode* p, struct TreeNode* q)比较左子树和右子树是否相同,如果刚开始root==NULL,肯定subroot不为子树返回false.建议大家画一下递归图会好理解很多。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Alfred v5.1.4(mac快速启动)

Mac效率办公软件哪个好?Alfred是一款Mac电脑上的快速启动和工作流自动化工具,它可以帮助用户快速访问文件、应用程序、web搜索和系统工具,提高工作效率。以下是Alfred的特点: 快速启动:用户可以通过Alfred快速启动应用…

scipy 笔记:scipy.spatial.distance

1 pdist 计算n维空间中观测点之间的成对距离。 scipy.spatial.distance.pdist(X, metriceuclidean, *, outNone, **kwargs) 1.1 主要参数 X一个m行n列的数组,表示n维空间中的m个原始观测点metric使用的距离度量out输出数组。如果非空,压缩的距离矩阵…

Dempster-Shafer(D-S)证据理论的基本定义和详细分析,优点,缺点,应用!!(系列1)

文章目录 前言一、D-S证据理论的应用:二、D-S证据理论的优点:三、D-S证据理论的缺陷:四、D-S组合规则:总结 前言 Dempster-Shafer(D-S)证据理论是一种不精确推理理论,也称为Dempster/Shafer证据…

深度学习第2天:RNN循环神经网络

☁️主页 Nowl 🔥专栏《机器学习实战》 《机器学习》 📑君子坐而论道,少年起而行之 文章目录 介绍 记忆功能对比展现 任务描述 导入库 处理数据 前馈神经网络 循环神经网络 编译与训练模型 模型预测 可能的问题 梯度消失 梯…

python 笔记 根据用户轨迹+基站位置,估计基站轨迹+RSRP

1 问题描述 已知用户实际的轨迹,和基站的位置,能不能得到用户所连接的基站,以及基站的信号强度RSRP? 1.1 几个假设 这里我们做几个假设: 每个用户有80%的概率连接最近的基站,有20%的概率选择其他的基站连…

在mysql存储过程中间部分,使用游标遍历动态结果集(游标动态传参使用)

mysql游标动态传参实现(动态游标) 1.问题2.需求描述3.实现3.1.使用3.2.代码(直接看这都可以) 1.问题 众所周知,mysql存储过程功能是没有oracle的包功能强大的,但是在去O的趋势下,mysql存储过程的…

使用git下载远程所有分支到本地

使用git下载远程所有分支到本地: 打开gitbash 输入以下命令即可: git clone git地址 cd git文件夹 git branch -r | grep -v \-> | while read remote; do git branch --track "${remote#origin/}" "$remote"; done git fetch -…

灭火器二维码巡检卡制作教程

每个消防器材生成独立二维码,取代传统纸质巡检卡,微信扫码巡检,巡检记录汇总后台,随时登录后台查看导出数据,管理人员绑定凡尔码小程序即可随时了解消防巡检完成情况。 生成灭火器巡检码流程图: 1、开通后…

百家号MCN是什么?百家号MCN禁止拉子账号怎么解决?

在当今数字化时代,社交媒体平台已成为人们获取信息、分享观点和创作内容的重要渠道之一。百家号作为百度旗下的自媒体平台,吸引了众多创作者和机构入驻,以分享优质内容并获得收益。在百家号上,MCN矩阵扮演着重要的角色&#xff0c…

目标检测原理

一、什么是目标检测 目标检测的任务是找出图像中所有感兴趣的目标(物体),确定他们的类别和位置,是计算机视觉领域的核心问题之一。由于各类物体有不同的外观、形状、姿态,再加上光照、遮挡等因素的干扰,目…

如何在Node.js和Express中设置TypeScript(2023年)

如何在Node.js和Express中设置TypeScript(2023年) 在这篇文章中,我们将介绍在Express应用程序中设置TypeScript的最佳方法,了解与之相关的基本限制。 文章目录 如何在Node.js和Express中设置TypeScript(2023年&#x…

RT-DETR 更换损失函数之 SIoU / EIoU / WIoU / Focal_xIoU

文章目录 更换方式CIoUDIoUEIoUGIoUSIoUWIoUFocal_CIoUFocal_DIoUFocal_EIoUFocal_GIoUFocal_SIoU提示更换方式 第一步:将ultralytics/ultralytics/utils/metrics.py文件中的bbox_iou替换为如下的代码:class

图书管理系统源码,图书管理系统开发,图书借阅系统源码三框架设计原理和说明

TuShuManger项目简介和创建 这里一共设计了6个项目,主要是借助三层架构思想分别设计了主要的三层,包括model实体层,Dal数据库操作层,Bll业务调用层,其他有公共使用项目common层,DButitly提取出来的数据库访问层,下面我们分别创建每个项目和开始搭建整个过程 TuShuManger…

第二十一章 解读XML与JSON文件格式(工具)

XML 带分隔符的文件仅有两维的数据:行 & 列。如果我们想在程序之间交换数据结构,需要一种方法把层次结构,序列,集合和其它的数据结构编码成文本。 今天要说的 XML 是最突出的处理上述这种转换的标记格式,它使用标…

【深度学习】如何找到最优学习率

经过了大量炼丹的同学都知道,超参数是一个非常玄乎的东西,比如batch size,学习率等,这些东西的设定并没有什么规律和原因,论文中设定的超参数一般都是靠经验决定的。但是超参数往往又特别重要,比如学习率&a…

Seurat Tutorial 1:标准分析流程,基于 PBMC 3K 数据集

目录 1 设置 Seurat 对象2 标准预处理工作流程 2.1 QC 和选择细胞进行进一步分析3 数据归一化4 识别高变特征(特征选择)5 标准化数据6 执行线性降维7 确定数据集的维度8 细胞聚类9 运行非线性降维 (UMAP/tSNE)10 寻找差异表达特征(cluster b…

OSG编程指南<十二>:OSG二三维文字创建及文字特效

1、字体基础知识 适当的文字信息对于显示场景信息是非常重要的。在 OSG 中,osgText提供了向场景中添加文字的强大功能,由于有第三方插件 FreeType 的支持,它完全支持TrueType 字体。很多人可能对 FreeType 和 TrueType 还不太了解&#xff0c…

小程序项目:springboot+vue基本微信小程序的宠物领养系统

项目介绍 当今科技发展迅速,交通环境也变得越来越复杂。人们的出行方式变得多元化,这给视障人士带来了一定的困扰。而导盲犬可以帮助视障人士外出行走,提高他们的生活质量。在我国,导盲犬的数量远远少于视障人士的数量。由于导盲…

WPF绘图技术介绍

作者:令狐掌门 技术交流QQ群:675120140 csdn博客:https://mingshiqiang.blog.csdn.net/ 文章目录 WPF绘图基本用法绘制直线在XAML中绘制直线在C#代码中绘制直线使用Path绘制直线注意 矩形绘制在XAML中绘制矩形在C#代码中绘制矩形设置矩形的位…

<JavaEE> Java中线程有多少种状态(State)?状态之间的关系有什么关系?

目录 一、系统内核中的线程状态 二、Java中的线程状态 一、系统内核中的线程状态 状态说明就绪状态线程已经准备就绪,随时可以接受CPU的调度。阻塞状态线程处于阻塞等待,暂时无法在CPU中执行。 二、Java中的线程状态 相比于系统内核,Java…