【二叉树】oj题

news2024/11/27 3:45:12

在处理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.建议大家画一下递归图会好理解很多。

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

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

相关文章

uiautomator2 无法连接 ATX-Agent

最近需要写个安卓自动项目,本身不想用appium 。主要是appium需要安装的依赖太多,一单换个环境又要配置新的环境。但是ATX-Agent装好之后怎么都连接不是。 报错信息如下: .........省略............ uiautomator2.exceptions.GatewayError: (…

OD机考真题搜集:叠积木1

题目 有一堆长方体积木,它们的高度和宽度都相同,但长度不一。 小橙想把这堆积木叠成一面墙,墙的每层可以放一个积木,或将两个积木拼接起来,要求每层的长度相同。若必须用完这些积木,叠成的墙最多为多少层?如下是叠成的一面墙的图示,积木仅按宽和高所在的面进行拼接。 …

[Spring] 字节一面~Spring 如何解决循环依赖问题 以及 @resource 与 @autowire 同时存在时谁生效

文章目录 Spring 如何解决循环依赖问题resource 与 autowire 同时存在时谁生效 Spring 如何解决循环依赖问题 Spring在实例化一个bean的时候,是首先递归实例化其所依赖的所有bean,直到某个bean没有依赖其他bean,此时就会将该实例返回&#x…

python基础练习题库实验4

文章目录 题目1代码实验结果 题目2代码实验结果 题目3代码实验结果 题目4代码实验结果 题目5代码实验结果 题目6代码实验结果 题目总结 题目1 编写一个程序,使用for循环语句和字符串格式显示以下精确输出。 例如: 代码 for i in range(1, 11):result…

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

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

智能优化算法应用:基于鲸鱼算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于鲸鱼算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于鲸鱼算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.鲸鱼算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…

[建议收藏] 一个网站集合所有最新最全的AI工具

今天给大家推荐一个宝藏的AI工具合集网站,有了这个网站,你们再也不用去其他地方找AI工具了。 名称:AI-BOT工具集 这个网站精选1000AI工具,并持续每天更新添加,包括AI写作、AI绘画、AI音视频处理、AI平面设计、AI自动编…

redis笔记 -- 基础数据结构

redis笔记 基础的数据结构:string、list、hash、set、zset 容器型数据结构(list、hash、set、zset)通用规则 如果容器不存在,就创建一个,再进行操作如果容器里没有数据了,就立即删除,回收内存…

人力资源管理后台 === 左树右表

1.角色管理-编辑角色-进入行内编辑 获取数据之后针对每个数据定义标识-使用$set-代码位置(src/views/role/index.vue) // 针对每一行数据添加一个编辑标记this.list.forEach(item > {// item.isEdit false // 添加一个属性 初始值为false// 数据响应式的问题 数据变化 视图…

Android 相机库CameraView源码解析 (一) : 预览

1. 前言 这段时间,在使用 natario1/CameraView 来实现带滤镜的预览、拍照、录像功能。 由于CameraView封装的比较到位,在项目前期,的确为我们节省了不少时间。 但随着项目持续深入,对于CameraView的使用进入深水区,逐…

Mybaits-plus的使用

MybatisPlus特性 润物无声: 只做增强不做改变,引入它不会对现有工程产生改变,如丝般顺滑。 效率至上 只需简单配置,即可快速进行单表CRUD操作,从而节省大量时间。 使用MybatisPlus依赖基本步骤 引入MybatisPlus依…

歌曲《难不难》由歌手荆涛演唱:面对挑战,勇敢前行

在人生的旅途中,我们都会遭遇种种困难和挑战。有时,一个看似简单的创意或想法,想要实现它却需要经历无数次的实践和辛酸。歌曲《难不难》由歌手荆涛演唱,以平实的语言和流畅的旋律,表达了面对困难和挑战时,…

使用360浏览器插件刷新网页

使用360浏览器插件刷新网页 1.打开360浏览器->扩展程序->更多扩展。 2.扩展中心->搜索”网页自动刷新”,然后安装。 3.在要学习的网页上,扩展程序中使用页面自动刷新插件。 4.如果页面打开慢就把10改大,比如改成15&#xff0…

新版idea如何开启多台JVM虚拟机

1.看看自己的项目 2.可能开始的时候啥也没有,就点Run Configuration Type 3.再点击Edit Configurations... 4.点击号添加SpringBoot 5.主类选择一下,一般就一个,点他选了就行。 6.然后点击Modify Options 选择添加add VM Options 7.点击appl…

Huggingface 超详细介绍

Hugging face 起初是一家总部位于纽约的聊天机器人初创服务商,他们本来打算创业做聊天机器人,然后在github上开源了一个Transformers库,虽然聊天机器人业务没搞起来,但是他们的这个库在机器学习社区迅速大火起来。目前已经共享了超…

windows的bat文件(学习笔记)

简介 通过windows的cmd执行的批处理,扩展名可以是.bat或.cmd(类似linux的shell脚本) 所有语句符号不区分大小写 帮助提示信息:命令 /? 1 基本语法 (1) 注释:rem 注释文本不执行 (2) 关闭盘符输出:e…

【软件测试】“我“做了一年的功能点点点测试,感觉在浪费时间...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 发现人们对测试非…

4/5G语音实现方案

今天又是学习充实的一天,今天我们来学习4G和5G语音实现方案的介绍,VOLITE通信流程是怎么样子的,和之前学的TCP协议有什么联系吗?今天我们换个角度来学习通信的流程~ 目录 2G/3G的电话和上网 4G语音实现方案 4G语音的三种方式 …

“BMP转PNG一键转换,批量处理图片,迈入高效图片管理新时代“

你是否曾经为了转换图片格式而烦恼?是否曾经因为一张一张地手动转换而感到无奈?现在,我们的全新工具将为你解决这些问题,开启高效图片管理新时代! 首先,我们进入首助编辑高手主页面,会看到有多种…

1、nmap常用命令

文章目录 1. 主机存活探测2. 常见端口扫描、服务版本探测、服务器版本识别3. 全端口(TCP/UDP)扫描4. 最详细的端口扫描5. 三种TCP扫描方式(1)TCP connect 扫描(2)TCP SYN扫描(3)TCP …