递归如何书写?

目录

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

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

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

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


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

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

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

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

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

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

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

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

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

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

而递归函数的话我认为要先写思路和定义再写输入。

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;
}

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

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

相关文章

python 散点图 分类_Python | 分类图

python 散点图 分类Visualizing different variables is also a part of basic plotting. Such variables can have different classes, for example, numerical or a category. Matplotlib has an important feature of Categorical Plotting. We can plot multiple categoric…

二叉树祖先节点_二叉树的祖先

二叉树祖先节点Problem statement: 问题陈述&#xff1a; Given a Binary Tree and a target key, write a function that prints all the ancestors of the key in the given binary tree. 给定二叉树和目标键&#xff0c;编写一个函数&#xff0c;以打印给定二叉树中键的所有…

CALayer精讲

CALayer精讲 CALayer包含在QuartzCore框架中&#xff0c;这是一个跨平台的框架&#xff0c;既可以用在iOS中又可以用在Mac OS X中。后面要学Core Animation就应该先学好Layer&#xff08;层&#xff09;。 我们看一下UIView与Layer之间的关系图&#xff08;图片来源于网络&…

rofl用什么播放_ROFL的完整形式是什么?

rofl用什么播放ROFL&#xff1a;笑在地板上滚动 (ROFL: Rolling On Floor Laughing) ROFL is an abbreviation of Rolling on Floor Laughing. ROFL is a very trendy internet slang between youngsters and used in text messaging, instant messaging, chatting, and social…

gif 格式 完整 检查_GIF的完整格式是什么?

gif 格式 完整 检查GIF&#xff1a;图形交换格式 (GIF: Graphics Interchange Format) GIF is an abbreviation of Graphics Interchange Format. It is extensively used for animations and still images on the World Wide Web. The image is set out is bitmap image and i…

Java基础_05

2019独角兽企业重金招聘Python工程师标准>>> 1&#xff1a;boolean运算符号 || 与 | && 与 &的区别。 Equals与innstanceof 1&#xff1a;java中的方法。方法的定义&#xff0c;参数、返回值、调用方式。 2&#xff1a;方法调用与参数传递、Static方…

Android Studio 之下载安装

2019独角兽企业重金招聘Python工程师标准>>> 目录[-] 背景Android Studio VS Eclipse下载创建HelloWorld项目背景 相信大家对Android Studio已经不陌生了&#xff0c;Android Studio是Google于2013 I/O大会针对Android开发推出的新的开发工具&#xff0c;目前很多开…

模拟UIWebView

2019独角兽企业重金招聘Python工程师标准>>> // // ViewController.m // 模拟UIWebView // // Created by dc0061 on 15/12/10. // Copyright © 2015年 dc0061. All rights reserved. //#import "ViewController.h"interface ViewController ()&…

4g 中bis代表什么_BIS的完整形式是什么?

4g 中bis代表什么BIS&#xff1a;印度标准局 (BIS: Bureau of Indian Standards) BIS is an abbreviation of the Bureau of Indian Standards. It is the National Standard Body of India which is operating in the groundwork and execution of the standards, certificati…

Feature selection

原文:http://scikit-learn.org/stable/modules/feature_selection.html The classes in the sklearn.feature_selection module can be used for feature selection/dimensionality reduction on sample sets, either to improve estimators’ accuracy scores or to boost the…

ronald aai_AAI的完整形式是什么?

ronald aaiAAI&#xff1a;印度机场管理局 (AAI: Airport Authority of India) AAI is an abbreviation of the Airport Authority of India. It operates under the Ministry of Civil Aviation. It is in charge of creating, crafting, maintaining and enhancing the civil…

使用Eclipse-Maven-git做Java开发(13)--导入git仓库的代码到eclipse

2019独角兽企业重金招聘Python工程师标准>>> 前面讲到了怎么使用osc的git服务进行代码托管。至此&#xff0c;我们已经可以使用git进行文件的版本管理了&#xff0c;甚至可以进行不需要IDE的编程了&#xff0c;但是我们绝大多数时候还是需要IDE的&#xff0c;接下来…

python 三维图直方图_Python | 阶梯直方图

python 三维图直方图A histogram is a graphical technique or a type of data representation using bars of different heights such that each bar groups numbers into ranges (bins or buckets). Taller the bar higher the data falls in that bin. A Histogram is one o…

ExtJS4.2学习(21)动态菜单与表格数据展示操作总结篇2

运行效果&#xff1a; 此文介绍了根据操作左侧菜单在右面板展示相应内容。 一、主页 先看一下跳转主页的方式&#xff1a;由在webapp根目录下的index.jsp跳转至demo的index.jsp 下面是demo的index.jsp的代码 <% page language"java" contentType"text/html; …

jQuery之call()方法的使用

最近在做项目时候&#xff0c;写了几行关于DOM操作的代码&#xff0c;在方法中使用了this&#xff0c;在后期重构的时候&#xff0c;想将这段分离出来做成一个方法。 最开始想的很简单&#xff0c;就直接分离出来使用方法名称调用即可。 但是实际操作的时候没有效果&#xff0c…

github的使用

GitHub操作总结 : 总结看不明白就看下面的详细讲解. GitHub操作流程 : 第一次提交 : 方案一 : 本地创建项目根目录, 然后与远程GitHub关联, 之后的操作一样; -- 初始化git仓库 :git init ; -- 提交改变到缓存 :git commit -m description ; -- 本地git仓库关联GitHub仓库 : g…

sql更改完整模式报错_SQL的完整形式是什么?

sql更改完整模式报错SQL&#xff1a;结构化查询语言 (SQL: Structured Query Language) SQL is an abbreviation of Structured Query Language. It is a programming language developed and designed for handling structured data in Relational Database Management System…

基于微服务架构,改造企业核心系统之实践

2019独角兽企业重金招聘Python工程师标准>>> 1. 背景与挑战 随着公司国际化战略的推行以及本土业务的高速发展&#xff0c;后台支撑系统已经不堪重负。在吞吐量、稳定性以及可扩展性上都无法满足日益增长的业务需求。对于每10万元额度的合同&#xff0c;从销售团队…

bkg bnc_BNC的完整形式是什么?

bkg bncBNC&#xff1a;刺刀Neill–Concelman (BNC: Bayonet Neill–Concelman) BNC is an abbreviation of "Bayonet Neill–Concelman". BNC是“刺刀Neill–Concelman”的缩写 。 It is also known as "British Naval Connector" or "Bayonet Nut …

使用visio 提示此UML形状所在的绘图页不是UML模型图的一部分 请问这个问题怎么解决?...

解决方法新建->选择软件与数据库模板->选择UML模型图->注意&#xff1a;如果不选择UML模型图的话&#xff0c;可能会出现无法编辑形状文本&#xff0c;提示“此UML形状所在的绘图页不是UML模型图的一部分&#xff0c;该形状设计用于利用UML模型图模板创建的绘图”关注…