递归如何书写?

目录

第一步:首先你分析问题,要有递归的思路,知道要递归什么来解决问题。

第二步:先按照思路(第一层)写出函数的定义与函数体

第三步:根据函数的定义与函数体进一步确定需要的参数

第四步:最后还要设定最后一层递归的终止条件,以免一直循环下去。


例题:给定一棵树的前序遍历数组,判断这棵树是不是二叉搜索树。

第一步:首先你分析问题,要有递归的思路,知道要递归什么来解决问题。

比如上面这个通过前序遍历判断搜索二叉树,首先我们要清楚二叉搜索树的定义。

根据定义,我们不难得出思路,先判断这颗二叉树的左子树(不为空的话)的所有结点是不是小于它的根结点,再判断右子树(不为空的话)的所有结点是不是大于它的根结点。

然后递归判断其左右子树(如果有的话)是不是也满足这个条件。

另外的话你也要清楚前序遍历的特点,第一个结点一定为根节点,然后的话遍历顺序为根结点->左子树->右子树。

结合搜索二叉树,我们可以得出第一个点为根结点,然后往后找,第一个比根结点小的树为左子树的根结点,第一个比根节点大的为右子树的根节点,左子树根节点与右子树根结点之间为左子树的前序遍历序列,右子树之后为右子树的前序遍历序列。

我们只需要看左子树的序列是不是都比根结点的数据小,右子树的序列是不是都比根节点的数据大。然后的话递归遍历左右子树的前序遍历序列看看是不是符合这个特点。

第二步:先按照思路(第一层)写出函数的定义与函数体

一般的话写函数都是先确定函数的定义与输入,然后按照思路写输出。

而递归函数的话我认为要先写思路和定义再写输入,或者先写部分输入,然后写完思路后再过来修改。

bool isBST() {
	int rootData=tree[leftBound].data;
	//寻找第一个比根结点小的数是左子树的根结点,
	//寻找第一个比根结点大与或等于的数即时右子树的根节点
	int leftRoot=-1,rightRoot=-1;
	for(int i=1; i<=n-1; i++) {
		if(tree[i].data<rootData&&leftRoot==-1) {
			leftRoot=i;
		} else if(tree[i].data>=rootData&&rightRoot==-1) {
			rightRoot=i;
			break;
		}
	}
    bool haveLeft=(leftRoot!=-1);//是否存在左子树
	bool haveRight=(rightRoot!=-1);//是否存在右子树
    //	根据左子树根结点和右子树根结点即可划分出左右子树
    //	遍历左子树,看看是不是都比根结点小(如果有的话)
	if(haveLeft) {
		for(int i=leftRoot; i<=rightRoot-1; i++) {
			if(rootData<=tree[i].data) {
				return false;
			}
		}
	}
    //遍历右子树,看看是不是都比根结点大(如果有的话)
	if(haveRight) {
		for(int i=rightRoot; i<=0; i++) {
			if(rootData>tree[i].data) {
				return false;
			}
		}
	}

	//子树也要满足是二叉搜索树(如果有的话)
	if(haveLeft&&haveRight) {
        //左子树
		if(!isBST())
			return false;
        //右子树
		if(!isBST())
			return false;
	} else if(haveLeft&&!haveRight) {
		if(!isBST())
			return false;
	} else if(!haveLeft&&haveRight) {
		if(!isBST())
			return false;
	}

	return true;
}

第三步:根据函数的定义与函数体进一步确定需要的参数,并修改原来的代码

上面的话我们的话我们肯定需要有一个tree数组代表数,另外的话我们上面的遍历是遍历整棵树,是从0到n-1,但是为了这个函数能够复用,所以我们需要传入leftBound和rightBound,即数组的左界和有界来确定一颗树。

添加参数并修改代码:

bool isBST(TreeNode tree[],int leftBound,int rightBound) {
	int rootData=tree[leftBound].data;
	//寻找第一个比根结点小的数是左子树的根结点,
	//寻找第一个比根结点大与或等于的数即时右子树的根节点
	int leftRoot=-1,rightRoot=-1;
	for(int i=leftBound+1; i<=rightBound; i++) {
		if(tree[i].data<rootData&&leftRoot==-1) {
			leftRoot=i;
		} else if(tree[i].data>=rootData&&rightRoot==-1) {
			rightRoot=i;
			break;
		}
	}
//	根据左子树根结点和右子树根结点即可划分出左右子树
//	遍历左子树,看看是不是都比根结点小
	bool haveLeft=(leftRoot!=-1);
	bool haveRight=(rightRoot!=-1);
	if(haveLeft) {
		for(int i=leftRoot; i<=rightRoot-1; i++) {
			if(rootData<=tree[i].data) {
				return false;
			}
		}
	}
	if(haveRight) {
		//遍历右子树,看看是不是都比根结点大
		for(int i=rightRoot; i<=rightBound; i++) {
			if(rootData>tree[i].data) {
				return false;
			}
		}
	}

	//子树也要满足是二叉搜索树
	if(haveLeft&&haveRight) {
		if(!isBST(tree,leftRoot,rightRoot-1))
			return false;
		if(!isBST(tree,rightRoot,rightBound))
			return false;
	} else if(haveLeft&&!haveRight) {
		if(!isBST(tree,leftRoot,rightBound))
			return false;
	} else if(!haveLeft&&haveRight) {
		if(!isBST(tree,rightRoot,rightBound))
			return false;
	}

	return true;
}

第四步:最后还要设定最后一层递归的终止条件,以免一直循环下去。

这题的话最终的话循环到最后的树一定就只剩下一个点,一个点的话肯定为搜索二叉树。

添加终止条件完成程序。

bool isBST(TreeNode tree[],int leftBound,int rightBound) {
	if(leftBound==rightBound) {
		return true;
	}
	int rootData=tree[leftBound].data;
	//寻找第一个比根结点小的数是左子树的根结点,
	//寻找第一个比根结点大与或等于的数即时右子树的根节点
	int leftRoot=-1,rightRoot=-1;
	for(int i=leftBound+1; i<=rightBound; i++) {
		if(tree[i].data<rootData&&leftRoot==-1) {
			leftRoot=i;
		} else if(tree[i].data>=rootData&&rightRoot==-1) {
			rightRoot=i;
			break;
		}
	}
//	根据左子树根结点和右子树根结点即可划分出左右子树
//	遍历左子树,看看是不是都比根结点小
	bool haveLeft=(leftRoot!=-1);
	bool haveRight=(rightRoot!=-1);
	if(haveLeft) {
		for(int i=leftRoot; i<=rightRoot-1; i++) {
			if(rootData<=tree[i].data) {
				return false;
			}
		}
	}
	if(haveRight) {
		//遍历右子树,看看是不是都比根结点大
		for(int i=rightRoot; i<=rightBound; i++) {
			if(rootData>tree[i].data) {
				return false;
			}
		}
	}

	//子树也要满足是二叉搜索树
	if(haveLeft&&haveRight) {
		if(!isBST(tree,leftRoot,rightRoot-1))
			return false;
		if(!isBST(tree,rightRoot,rightBound))
			return false;
	} else if(haveLeft&&!haveRight) {
		if(!isBST(tree,leftRoot,rightBound))
			return false;
	} else if(!haveLeft&&haveRight) {
		if(!isBST(tree,rightRoot,rightBound))
			return false;
	}

	return true;
}

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

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

相关文章

golang基于window下实现文件遍历(效率高于filepath.Wlak)

golang基于window下实现文件遍历(效率高于filepath.Wlak) package mainimport ("fmt""os""path""path/filepath""syscall""time""unsafe" )const MAX_PATH 260type FILETIME struct {dwLowDateTime …

html之为什么使用表单,常用表单元素使用?

文章目录 一、为什么使用表单呢&#xff1f;二、常用表单元素使用三、总结 一、为什么使用表单呢&#xff1f; 为什么使用表单呢&#xff0c;使用表单是为了更好的收集用户数据&#xff0c;并且安全 二、常用表单元素使用 1、password密码框 密码框&#xff1a;会隐藏数据&a…

06.微服务组件 Gateway

1、Gateway 简介 在SpringCloud中网关的实现包括两种&#xff1a; Zuul是基于Servlet的实现&#xff0c;属于阻塞式编程。SpringCloudGateway是基于Spring5中提供的WebFlux心属于响应式编程的实现&#xff0c;具备更好的性能。 2、搭建网关服务 步骤一&#xff1a;创建gatewa…

TwIST算法MALTLAB主程序详解

TwIST算法MALTLAB主程序详解 关于TwIST算法的具体原理可以参考&#xff1a; 链接: https://ieeexplore.ieee.org/abstract/document/4358846 链接: https://blog.csdn.net/jbb0523/article/details/52193209 该算法的MATLAB源代码&#xff1a; 链接: http://www.lx.it.pt/~bi…

Unity查安卓Native Crash的方法,定位SO报错函数

需要用到两个工具Il2CppDumper和IDA_Pro&#xff0c;网上可以下到对应的软件 可以看到报错的位置是libil2cpp.so 0000000000AFF820 接下来要做的事情就是找到0000000000AFF820对应的函数是哪个 解包 Il2CppDumper解析so文件和符号表&#xff0c;查看对应的函数表 把apk后缀…

Cloudstack多个管理服务器节点

https://docs.cloudstack.apache.org/en/4.18.0.0/adminguide/reliability.html 参考翻译&#xff1a; 代理上支持多个管理服务器 在具有多个管理服务器的Cloudstack环境中&#xff0c;可以根据算法配置代理&#xff0c;将其连接到哪个管理服务器。这对于内部负载均衡器或高可…

大数据----MapReduce实现统计单词

目录 一、简介二、实现单词统计数据准备编程MapReduceJob 三、运行四、结果 一、简介 Hadoop MapReduce 是一个编程框架&#xff0c;它可以轻松地编写应用程序&#xff0c;以可靠的、容错的方式处理大量的数据(数千个节点)。 正如其名&#xff0c;MapReduce 的工作模式主要分…

docker部署mysql主主备份 haproxy代理(swarm)

docker部署mysql主主备份 haproxy代理&#xff08;swarm&#xff09; docker部署mysql主主备份 docker部署mysql主主备份&#xff08;keepalived&#xff09;跨主机自动切换 docker部署mysql主主备份 haproxy代理&#xff08;swarm&#xff09; 1. 环境准备 主机IPnode119…

28、清华大学脑机接口实验组SSVEP数据集:通过视觉触发BCI[飞一般的赶脚!]

前言&#xff1a; 哈喽&#xff0c;最近对清华大学脑机接口的数据进行了尝试&#xff0c;输入到了DL模型中&#xff0c;以下是本人对于清华BCI数据的个人见解。 数据地址&#xff1a; 清华大学脑机接口研究组 (tsinghua.edu.cn) 打开网站可以看到有很多个数据&#xff0c;官…

洛谷——【数据结构1-2】二叉树

文章目录 题目【深基16.例1】淘汰赛题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1基本思路&#xff1a;代码 【深基16.例3】二叉树深度题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1基本思路&#xff1a;代码 [USACO3.4] 美国血统 American Heritage题目描…

小城交通大转型!苏州金龙助力杭州建德公交开新格局

新安江畔&#xff0c;密林丛生&#xff0c;一辆辆绿色巴士穿梭而行&#xff0c;杭州市首款纯电动无站立位公交车正在试运行中。 12月19日&#xff0c;杭州建德&#xff0c;23辆苏州金龙海格牌6米无站立位新能源纯电动公交车正式交付建德市公共交通运输有限公司。自此&#xff…

【AI】使用阿里云免费服务器搭建Langchain-Chatchat本地知识库

书接上文&#xff0c;由于家境贫寒的原因&#xff0c;导致我本地的GPU资源无法满足搭建Langchain-Chatchat本地知识库的需求&#xff0c;具体可以看一下这篇文章&#xff0c;于是我只能另辟蹊径&#xff0c;考虑一下能不能白嫖一下云服务器资源&#xff0c;于是去找网上找&…

2023航天推进理论基础考试划重点(W老师)绪论固体推进剂

1、推进系统的分类&#xff1a; 按工作原理分&#xff0c; 直接反作用发动机(喷气发动机) 火箭发动机、组合发动机、冲压发动机、涡轮喷气发动机、涡轮风扇发动机 间接反作用发动机 活塞式发动机、涡轮螺旋桨发动机、涡轮轴发动机、航空电动机 2、后面不细讲的火箭发动机要…

Adobe软件打开后设置默认页面方式和默认鼠标方式

PDF文件打开后是默认显示&#xff0c;与显示器比例不协调&#xff0c;或大或小&#xff0c;总是需要手动调节阅读方式&#xff0c;解决方法如下&#xff1a; Adobe软件中可以设置默认页面方式&#xff0c;具体步骤如下&#xff1a; 编辑 (Edit)-首选项(Preferences)-辅助工具…

车牌识别系统的设计matlab图像处理

wx供重浩&#xff1a;创享日记 对话框发送&#xff1a;车牌23 获取完整论文报告源码源程序文件 一、 摘要 随着公路逐渐普及&#xff0c;我国的公路交通事业发展迅速&#xff0c;所以人工管理方式已经不能满着实际的需要&#xff0c;微电子、通信和计算机技术在交通领域的应用…

2024年最新Python爬虫入门『最强教程』新鲜出炉!

近年来&#xff0c;大数据成为业界与学术界最火热的话题之一&#xff0c;数据已经成为每个公司极为重要的资产。互联网大量的公开数据为个人和公司提供了以往想象不到的可以获取的数据量。而掌握网络爬虫技术可以帮助你获取这些有用的公开数据集。 爬虫能干什么呢&#xff1f;一…

【强化学习】PPO:近端策略优化算法

近端策略优化算法 《Proximal Policy Optimization Algorithms》 论文地址&#xff1a;https://arxiv.org/pdf/1707.06347.pdf 一、 置信域方法(Trust Region Methods) ​ 设 π θ o l d \pi_{\theta_{old}} πθold​​是先前参数为 θ o l d \theta_{old} θold​的策略网…

5个适合初学者的初级网络安全工作

前言&#xff1a; 网络安全涉及保护计算机系统、网络和数据免受未经授权的访问、破坏和盗窃 - 防止数字活动和数据访问的中断 - 同时也保护用户的资产和隐私。鉴于公共事业、医疗保健、金融以及联邦政府等行业的网络犯罪攻击不断升级&#xff0c;对网络专业人员的需求很高&…

三级安全教育二维码怎么生成

三级安全教育是工人进场上岗前必备的过程&#xff0c;也是施工项目中非常重要的一项工作&#xff0c;我们要合理规范地进行安全教育培训工作&#xff0c;提升真实性和可靠性&#xff0c;保障工人的安全到位。 1、将三级安全教育制作成二维码,放在施工现场等位置,工人可以随时随…

行人重识别数据集-统一为market1501数据集进行多数据集联合训练

一、前言 常用的数据集&#xff1a; 数据集下载链接&#xff1a;https://kaiyangzhou.github.io/deep-person-reid/datasets.html https://kaiyangzhou.github.io/deep-person-reid/datasets.html#sensereid-sensereid 二、数据集合并 第一步&#xff1a;market1501的数据集…