递归如何书写?

目录

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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.hqwc.cn/news/298592.html

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

相关文章

基于ssm出租车管理系统的设计与实现论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本出租车管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息&…

Matlab仿真2ASK/OOK、2FSK、2PSK、QPSK、4QAM在加性高斯白噪声信道中的误码率与归一化信噪比的关系

本文为学习所用&#xff0c;严禁转载。 本文参考链接 https://zhuanlan.zhihu.com/p/667382398 QPSK代码及高斯白噪声如何产生 https://ww2.mathworks.cn/help/signal/ref/butter.html 滤波器 https://www.python100.com/html/4LEF79KQK398.html 低通滤波器 本实验使用matlab仿…

SparkSQL 执行底层原理解析

从Spark SQL 底层架构可以看到&#xff0c;我们写的SQL语句&#xff0c;经过一个优化器&#xff08;Catalyst&#xff09;处理&#xff0c;转化为可执行的RDD&#xff0c;提交给集群执行。 SQL到RDD中间经过了一个Catalyst&#xff0c;它便是Spark SQL的核心&#xff0c;是针对…

伙伴计划|“团团活力圈”--青少年心理游戏拓展活动— 不倒森林

开学的欢声笑语犹在耳畔&#xff0c;转眼间学期已即将过半&#xff0c;眼下期中考试将要来临&#xff0c;部分青少年处在紧张焦虑的状态之中&#xff0c;为了帮助辖区青少年们释放内心压力、建立积极心态、培养抗挫能力&#xff0c;同时提升青少年的团队意识、增强凝聚力&#…

postman的下载安装和使用

第一章、使用postman向后端发送请求 1.2&#xff09;postman下载与安装使用 我的百度网盘postman点击下载 提取码&#xff1a;bybp 下载后双击.exe文件直接安装 点击此次创建集合 点击此处创建请求 1.2&#xff09;发送get请求 选择自己的请求方式&#xff0c;输入请求…

移动开发git版本控制经验之谈

移动开发git版本控制经验之谈 团队或应用规模是否会影响发布流程&#xff1f;这取决于具体情况。让我们来想象一下一个小型团队的创业公司。在这种情况下&#xff0c;通常是团队开发一个功能&#xff0c;然后直接发布。现在我们再来想象一个大型项目&#xff0c;比如一个银行应…

<软考高项备考>《论文专题 - 25 整合管理(3) 》

4 过程3-指导与管理项目工作 4.1 问题 4W1H过程1-制定项目章程做什么为实现项目目标而领导和执行项目管理计划中所确定的工作&#xff0c;并实施已批准变更的过程&#xff1b;作用&#xff1a;对项目工作和可交付成果开展综合管理&#xff0c;以提高项目成功的可能性为什么做…

二叉搜索树中第K小的元素

题目链接 二叉搜索树中第K小的元素 题目描述 注意点 树中的节点数为 n0 < Node.val < 10000 解答思路 由于是二叉搜索树&#xff0c;特点是左子树中节点的值始终小于根节点的值&#xff0c;右子树的值始终大于根节点的值&#xff0c;所以想到使用中序遍历找到二叉搜…

ECMAScript 的未来:预测 JavaScript 创新的下一个浪潮

以下是简单概括关于JavaScript知识点以及一些目前比较流行的比如&#xff1a;es6 想要系统学习&#xff1a; 大家有关于JavaScript知识点不知道可以去 &#x1f389;博客主页&#xff1a;阿猫的故乡 &#x1f389;系列专栏&#xff1a;JavaScript专题栏 &#x1f389;ajax专栏&…

【每周AI简讯】Midjourney发布V6版本,哥伦比亚大学发布“算命”大模型Life2Vec

Midjourney史诗级增强V6版本上线 文生图领域的王者Midjourney最近日推出大版本V6。根据Midjourney官方描述&#xff0c;V6版本具有更精确且更长的提示响应&#xff0c;改进了连贯性和模型知识&#xff0c;图象生成和混合&#xff08;remix&#xff09;得到了优化&#xff0c;新…

简单的喷淋实验--嵌入式实训

目录 喷淋实验--嵌入式实训 1.MQTT通信原理 2.MQTT库的移植 3.代码流程 运行视频如下: 喷淋实验--嵌入式实训 1.MQTT通信原理 MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;是一种轻量级的发布/订阅消息传输协议&#xff0c;旨在提供可靠、高效的通信…

基于VUE3+Layui从头搭建通用后台管理系统(前端篇)十七:演示功能模块相关功能实现

一、本章内容 本章实现常见业务功能,包括文章管理、商品管理、订单管理、会员管理等功能。 1. 详细课程地址: https://edu.csdn.net/course/detail/38183 2. 源码下载地址: 点击下载 二、界面预览 三、开发视频 3.1 B站视频地址: