【数据结构】二叉树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.建议大家画一下递归图会好理解很多。

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

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

相关文章

Windows系统下更新后自带的画图软件出现马赛克bug

一.bug的样子🍗 在使用橡皮后,原来写的内容会变成马赛克。而我们希望它是纯白色的。 二.解决方法🍗 第一步 第二步 第三步 三. 解决后的效果🍗 用橡皮擦随便擦都不会出现马赛克了。 更新过后,想用win自带的画图软件会出…

梦回吹角连营(超1e18的快速幂模板,两大数相乘处理)

Description 给定f(n)n^an^(a1)...n^(b-1)n^b 求f(n)%MOD Input 输入一个正整数T(T<10),表示有T组数据&#xff0c;每组数据包括三个整数a,b,n(0<n,a,b<1e9) Output 输出 f(n)%10000000033 的结果Sample Input 2 1 2 3 2 1 3 Sample Output 12 12 思路&#…

【前沿技术了解】web图形Canvas、svg、WebGL、数据可视化引擎的技术选型

目录 Canvas&#xff1a;HTML5新增 Canvas标签&#xff08;画布&#xff09; 渲染上下文canvas.getContext(contextType[, contextAttributes]) 上下文类型&#xff08;contextType&#xff09; 上下文属性 (contextAttributes) 示例 动画 setInterval(function, delay)…

2023/11/26总结

一些学习记录&#xff1a; 在对数据库进行一系列操作的时候&#xff0c;遇到一个问题&#xff0c;在插入数据的时候&#xff0c;我数据库对应的是自增id&#xff0c;但是插入后想获取到这个id去使用。我以为是不可以马上获取的&#xff0c;然后看到 项目进度 购物车&#xff…

[pyqt5]PyQt5之如何设置QWidget窗口背景图片问题

目录 PyQt5设置QWidget窗口背景图片 QWidget 添加背景图片问题QSS 背景图样式区别PyQt设置窗口背景图像&#xff0c;以及图像自适应窗口大小变化 总结 PyQt5设置QWidget窗口背景图片 QWidget 添加背景图片问题 QWidget 创建的窗口有时并不能直接用 setStyleSheet 设置窗口部分…

【学习记录】从0开始的Linux学习之旅——驱动模块编译与加载

一、概述 Linux操作系统通常是基于Linux内核&#xff0c;并结合GNU项目中的工具和应用程序而成。Linux操作系统支持多用户、多任务和多线程&#xff0c;具有强大的网络功能和良好的兼容性。本文主要讲述如何编译及加载linux驱动模块。 二、概念及原理 应用程序通过系统调用与内…

软件介绍02- flameshot截图软件(linux系统可用)

1 软件介绍 在Windows和mac平台一直都使用着snipaste截图&#xff0c;非常好用&#xff0c;又能够钉图。遗憾是并没有开发linux版本&#xff0c;真不知道为什么。 好在终于找到一款截图软件&#xff0c;flameshot截图软件&#xff0c;可以平替snipaste。 下载网址&#xff1a;…

华为eNSP使用教程(Enterprise Network Simulation Platform,企业网络仿真平台)

文章目录 华为eNSP使用教程详解引言eNSP界面快速入门启动与初始设置主界面组成创建和管理项目 构建网络拓扑添加和连接设备配置设备参数示例&#xff1a;配置设备接口IP 保存配置 仿真网络功能启动与测试示例&#xff1a;测试网络连通性 使用调试工具 疑难技术点解析路由协议配…

C语言WFC绘制矩形

代码实现&#xff1a; void CCGDrawingView::Rectangle(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4, COLORREF color,CDC* pDC) {CPen redPen(PS_SOLID, 1, color);CBrush redBursh(color);CPen* pOldPen pDC->SelectObject(&redPen);CBrush* p…

Django(十一、auth认证模块)

文章目录 一、auth介绍auth认证相关模块及操作扩展auth_user表 一、auth介绍 Django自带一个admin路由&#xff0c;但是需要我们提供管理员账户和密码&#xff0c;如果想要使用admin后台管理&#xff0c;需要先创建表&#xff0c;然后创建管理员账户。 直接执行数据类迁移命令…

hivesql 将json格式字符串转为数组

hivesql 将json格式字符串转为数组 完整过程SQL在文末 json 格式字符串 本案例 json 字符串参考格式&#xff0c;请勿使用本数据 {"data": [{"province": 11,"id_card": "110182198903224674","name": "闾丘饱乾"…

【JAVA学习笔记】71 - JDBC入门

项目代码 https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter25/src/com/yinhai/dao_ 一、JDBC概述 1.基本介绍 1. JDBC为访问不同的数据库提供了统一的接口&#xff0c;为使用者屏蔽了细节问题。 2. Java程序员使用JDBC,可以连接任何提供了JDBC驱动…

YARN工作流程详解

图1 图2 图1 -作业提交阶段&#xff1a; 1、client 提交job,向 ResourceManager【RM】 申请job_id; 2、RM 返回 job_id 及资源提交路径 给 client 3、client 把job所需的资源提交 到 3中指定的路径中 4、client 上传完成资源后&#xff0c;向RM 发送执行作业请求&#xff0c;RM…

《杀死一只知更鸟》

今天在读一篇英文文献的时候&#xff0c;摘要里有这样一句话&#xff1a;The developed algorithm is successfully applied to mock and real word problems。看到mock这个单词&#xff0c;想起最近一周在看的一本书《杀死一只知更鸟》&#xff0c;书的英文名叫《To Kill A Mo…

手写操作js数组的常见方法

文章目录 1.push2.pop3.unshift4.shift5.slice6.splice7.forEach8.map9.filter10.some11.every12.concat13.join14.indexOf15.lastIndexOf16.reserve17.sort18.find19.reduce 1.push // push() 方法可向数组的末尾添加一个或多个元素&#xff0c;并返回新的长度。 // 末尾添加…

BGP选路实验

要求 1 使用PreVal策略&#xff0c;确保R4通过R2到达192.168.10.0/24 2 使用AS_Path策略&#xff0c;确保R4通过R3到达192.168.11.0/24 3 配置MED策略&#xff0c;确保R4通过R3到达192.168.12.0/24 4 使用Local Preference策略&#xff0c;确保R1通过R2到达192.168.1.0/24 5 使…

服务器tar压缩解压文件

文章目录 一、前言二、命令2.1、解压2.2、压缩 三、最后 一、前言 前端上传dist代码到服务器上后&#xff0c;是在linux上操作&#xff0c;所以和window有所不同。一般是打好dist&#xff0c;然后压缩成gz传输到服务器&#xff0c;此时在服务器上可能涉及到解压和压缩的操作&a…

力扣日记11.25-【二叉树篇】对称二叉树

力扣日记&#xff1a;【二叉树篇】对称二叉树 日期&#xff1a;2023.11.25 参考&#xff1a;代码随想录、力扣 101. 对称二叉树 题目描述 难度&#xff1a;简单 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,…

操作系统题目分类总结 | 进程管理 内存管理 文件系统 设备管理

系列文章如下 学习过程中一定要有系统观念&#xff08;知识框架&#xff0c;每一章开头都会有一个思维导图&#xff09;&#xff0c;知道目前自己在学习的是哪一板块的内容&#xff0c;和前面有什么样的联系 操作系统的很多知识点前后都是联系非常紧密的&#xff0c;去一点一…

PCL 计算一条直线与一条线段的距离

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 这里的线段我们仍然使用一种参数化的表示,即 Q [ 0 ] + s [ 0 ] ∗ ( Q [ 1 ] − Q [ 0