c++二叉排序树的非递归插入与递归插入,递归之间不同写法的思考
一、非递归
非递归1:
Node *bst_insert(Node *t, int key){Node *p = t;while(p != NULL){if(key = p->data){return t;}else if(key < p->data){p = p->lchild;}else {p = p->rchild;}}//执行到这里p为空p = (Node *)malloc(sizeof(Node));//此处直接将新节点放在应该放的位置p->data = key;p->lchild = p->rchild = NULL;return t;
}
直接修改。
非递归2
Node *bst_insert(Node *t, int key){Node *p = t;while(p != NULL){if(key = p->data){return t;}else if(key < p->data){p = p->lchild;}else {p = p->rchild;}}//执行到这里p为空Node *temp = (Node *)malloc(sizeof(Node));//此处直接将新节点保存在temp里面temp->data = key;temp->lchild = temp->rchild = NULL;p = temp;//将节点放在正确的位置return t;
}
利用temp修改。
二、递归
递归1:
Node *bst_insert(Node *t, int key){if(t == NULL){t = (Node *)malloc(sizeof(Node));//此处直接将新节点放在应该放的位置t->data = key;t->lchild = t->rchild = NULL;return t;}//执行到这里t一定不为空if(key = t->data){return t;}else if(key < t->data){return bst_insert(t->lchild, key);}else {return bst_insert(t->rchild, key);}
}
直接修改。
递归2:
Node *bst_insert(Node *t, int key){if(t == NULL){Node *temp = (Node *)malloc(sizeof(Node));//此处直接将新节点保存,至于为什么保存?等下解释temp->data = key;temp->lchild = temp->rchild = NULL;return temp;}//执行到这里t一定不为空if(key = t->data){return t;}else if(key < t->data){//return bst_insert(t->lchild, key);原来这里返回的就是新节点的temp节点,这里需要需改t->lchild = bst_insert(t->lchild, key);return t;}else {//return bst_insert(t->rchild, key);原来这里返回的就是新节点的temp节点,这里需要需改t->rchild = bst_insert(t->rchild, key);return t;}
}
利用temp修改。
递归3:
把递归2的代码精简一下
Node *bst_insert(Node *t, int key){if(t == NULL){Node *temp = (Node *)malloc(sizeof(Node));temp->data = key;temp->lchild = temp->rchild = NULL;return temp;}if(key = t->data){//return t;这里}else if(key < t->data){t->lchild = bst_insert(t->lchild, key);//return t;这里}else {t->rchild = bst_insert(t->rchild, key);//return t;这里}return t;//总结为1个
}
精简一下递归2返回值。
至于递归2中为什么非要把节点暂存为temp呢?,因为我们在写项目的时候,很多情况下要把功能抽出来变成单独的函数,不是全部黏在一块,比如把新生成的节点写成getNewNode()再看看。
Node *getNewNode(int key){Node *temp = (Node *)malloc(sizeof(Node));temp->data = key;temp->lchild = temp->rchild = NULL;return temp;
}
把生成新节点抽出来变成一个函数,这个函数返回值是新节点的地址。
这时候我们重新审视一下递归1
、递归2
、递归3
分别该怎么改写。
递归1.1:
Node *bst_insert(Node *t, int key){if(t == NULL){//t = (Node *)malloc(sizeof(Node));//t->data = key;//t->lchild = t->rchild = NULL;t = getNewNode(key);//这里改变return t;}//执行到这里t一定不为空if(key = t->data){return t;}else if(key < t->data){return bst_insert(t->lchild, key);}else {return bst_insert(t->rchild, key);}
}
递归2.1:
Node *bst_insert(Node *t, int key){if(t == NULL){//Node *temp = (Node *)malloc(sizeof(Node));//temp->data = key;//temp->lchild = temp->rchild = NULL;temp = getNewNode(key);//这里改变return temp;}//执行到这里t一定不为空if(key = t->data){return t;}else if(key < t->data){//return bst_insert(t->lchild, key);原来这里返回的就是新节点的temp节点,这里需要需改t->lchild = bst_insert(t->lchild, key);return t;}else {//return bst_insert(t->rchild, key);原来这里返回的就是新节点的temp节点,这里需要需改t->rchild = bst_insert(t->rchild, key);return t;}
}
递归3.1:
Node *bst_insert(Node *t, int key){if(t == NULL){//Node *temp = (Node *)malloc(sizeof(Node));//temp->data = key;//temp->lchild = temp->rchild = NULL;temp = getNewNode(key);//这里改变return temp;}if(key = t->data){}else if(key < t->data){t->lchild = bst_insert(t->lchild, key);}else {t->rchild = bst_insert(t->rchild, key);}return t;
}
三个递归都只是改了temp。
网上有各种各样的写法,个人觉得递归1
、递归1.1
好理解,但是也能看到递归2.1
、递归3.1
的写法,其中细节不相同,需要注意!
c++二叉排序树的非递归插入与递归插入,递归之间不同写法的思考相关推荐
- 二叉树C++ | 链表递归实现二叉树(插入、搜索)_1
递归实现二叉树(插入.搜索) // Binary Search Tree - Implemenation in C++ // Simple program to create a BST of int ...
- java break递归_【Java】递归总结
摘要: 大师 L. Peter Deutsch 说过:To Iterate is Human, to Recurse, Divine.中文译为:人理解迭代,神理解递归.毋庸置疑地,递归确实是一个奇妙的 ...
- python面向过程实践汉诺塔_递归汉诺塔-和递归汉诺塔相关的内容-阿里云开发者社区...
多柱汉诺塔最优算法设计探究 多柱汉诺塔最优算法设计探究 引言 汉诺塔算法一直是算法设计科目的最具代表性的研究问题,本文关注于如何设计多柱汉诺塔最优算法的探究.最简单的汉诺塔是三个柱子(A.B.C),因 ...
- 计算机中 递归 的概念,递归是什么?关于递归的详细介绍
递归,又译为递回,在数学与计算机科学中,是指在函数的定义中使用函数自身的方法.递归一词还较常用于描述以自相似方法重复事物的过程.例如,当两面镜子相互之间近似平行时,镜中嵌套的图像是以无限递归的形式出现 ...
- 深度理解递归,手撕经典递归问题(汉诺塔,青蛙跳台阶),保姆级教学。
目录 序言: 一.函数递归( recursion) 二.递归的两个必要条件 三.递归小问题 (1)接受一个整型值(无符号),按照顺序打印它的每一位 (2)编写函数不允许创建临时变量,求字符串的长度(利 ...
- python递归必须要有_python递归
在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. (1)递归就是在过程或函数里调用自身: (2)在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口. 递归 ...
- java实现递归下降分析_使用递归实现检查未知层级目录中的文件-Java实用技能
现在有这样一个需求,给你一个目录,需要你在此目录中查找全部名字中包含指定字符的文件. 这题的主要难点在于:目录中可能包含子目录,子目录中又会包含子目录.而我们事先没办法确定子目录到底有多少层!这时候就 ...
- python递归详解_Python理解递归的方法总结
递归 一个函数在执行过程中一次或多次调用其本身便是递归,就像是俄罗斯套娃一样,一个娃娃里包含另一个娃娃. 递归其实是程序设计语言学习过程中很快就会接触到的东西,但有关递归的理解可能还会有一些遗漏,下面 ...
- 递归的效率问题及递归与循环比较
1.所谓的递归慢到底是什么原因呢? 大家都知道递归的实现是通过调用函数本身,函数调用的时候,每次调用时要做地址保存,参数传递等,这是通过一个递归工作栈实现的.具体是每次调用函数本身要保存的内容包括:局 ...
最新文章
- Jquery LigerUI
- 为啥有的程序员不爱说话,却表达能力爆表?(附教程)
- hyperterminal使用教程_如何在Win中安装使用超级终端HyperTerminal.doc
- iis10.0 php多版本,IIS7 IIS8 中多个版本php共存的方法
- This is Huge! PhysBAM code is going to be released?
- 当画面出现问题时,如何调试!
- 2021-02-02 天地图图层类型
- ffmpeg一些filter用法、以及一些功能命令
- C++ 字符编码转换之UTF-8/UTF-16/UTF-32
- 2429: [HAOI2006]聪明的猴子
- 2017-2018-2 20155225《网络对抗技术》实验四 恶意代码分析
- 【git提交报错】git commit 提交的时候报错husky > pre-commit (node v16.15.0) No staged files match any of provided
- Android 微信双开
- Win8.1安装与初次体验(图赏)
- SpringBoot使用SpringDataJPA通过方法名查询
- Spring实现依赖注入的几种方式
- 蓝牙芯片排行_7月TWS硅麦出货量排行榜出炉
- 2020年最值得加入的互联网公司有哪些?
- D. Genius‘s Gambit 构造题+思维
- 与自己和解:做一些看似没用的事