一、非递归

非递归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++二叉排序树的非递归插入与递归插入,递归之间不同写法的思考相关推荐

  1. 二叉树C++ | 链表递归实现二叉树(插入、搜索)_1

    递归实现二叉树(插入.搜索) // Binary Search Tree - Implemenation in C++ // Simple program to create a BST of int ...

  2. java break递归_【Java】递归总结

    摘要: 大师 L. Peter Deutsch 说过:To Iterate is Human, to Recurse, Divine.中文译为:人理解迭代,神理解递归.毋庸置疑地,递归确实是一个奇妙的 ...

  3. python面向过程实践汉诺塔_递归汉诺塔-和递归汉诺塔相关的内容-阿里云开发者社区...

    多柱汉诺塔最优算法设计探究 多柱汉诺塔最优算法设计探究 引言 汉诺塔算法一直是算法设计科目的最具代表性的研究问题,本文关注于如何设计多柱汉诺塔最优算法的探究.最简单的汉诺塔是三个柱子(A.B.C),因 ...

  4. 计算机中 递归 的概念,递归是什么?关于递归的详细介绍

    递归,又译为递回,在数学与计算机科学中,是指在函数的定义中使用函数自身的方法.递归一词还较常用于描述以自相似方法重复事物的过程.例如,当两面镜子相互之间近似平行时,镜中嵌套的图像是以无限递归的形式出现 ...

  5. 深度理解递归,手撕经典递归问题(汉诺塔,青蛙跳台阶),保姆级教学。

    目录 序言: 一.函数递归( recursion) 二.递归的两个必要条件 三.递归小问题 (1)接受一个整型值(无符号),按照顺序打印它的每一位 (2)编写函数不允许创建临时变量,求字符串的长度(利 ...

  6. python递归必须要有_python递归

    在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. (1)递归就是在过程或函数里调用自身: (2)在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口. 递归 ...

  7. java实现递归下降分析_使用递归实现检查未知层级目录中的文件-Java实用技能

    现在有这样一个需求,给你一个目录,需要你在此目录中查找全部名字中包含指定字符的文件. 这题的主要难点在于:目录中可能包含子目录,子目录中又会包含子目录.而我们事先没办法确定子目录到底有多少层!这时候就 ...

  8. python递归详解_Python理解递归的方法总结

    递归 一个函数在执行过程中一次或多次调用其本身便是递归,就像是俄罗斯套娃一样,一个娃娃里包含另一个娃娃. 递归其实是程序设计语言学习过程中很快就会接触到的东西,但有关递归的理解可能还会有一些遗漏,下面 ...

  9. 递归的效率问题及递归与循环比较

    1.所谓的递归慢到底是什么原因呢? 大家都知道递归的实现是通过调用函数本身,函数调用的时候,每次调用时要做地址保存,参数传递等,这是通过一个递归工作栈实现的.具体是每次调用函数本身要保存的内容包括:局 ...

最新文章

  1. Jquery LigerUI
  2. 为啥有的程序员不爱说话,却表达能力爆表?(附教程)
  3. hyperterminal使用教程_如何在Win中安装使用超级终端HyperTerminal.doc
  4. iis10.0 php多版本,IIS7 IIS8 中多个版本php共存的方法
  5. This is Huge! PhysBAM code is going to be released?
  6. 当画面出现问题时,如何调试!
  7. 2021-02-02 天地图图层类型
  8. ffmpeg一些filter用法、以及一些功能命令
  9. C++ 字符编码转换之UTF-8/UTF-16/UTF-32
  10. 2429: [HAOI2006]聪明的猴子
  11. 2017-2018-2 20155225《网络对抗技术》实验四 恶意代码分析
  12. 【git提交报错】git commit 提交的时候报错husky > pre-commit (node v16.15.0) No staged files match any of provided
  13. Android 微信双开
  14. Win8.1安装与初次体验(图赏)
  15. SpringBoot使用SpringDataJPA通过方法名查询
  16. Spring实现依赖注入的几种方式
  17. 蓝牙芯片排行_7月TWS硅麦出货量排行榜出炉
  18. 2020年最值得加入的互联网公司有哪些?
  19. D. Genius‘s Gambit 构造题+思维
  20. 与自己和解:做一些看似没用的事

热门文章

  1. 什么是机器学习,为什么它如此重要?
  2. Oracle中的dual表
  3. 微服务项目--商城管理系统的整合与测试
  4. HTML+CSS+JS制作【飞机大战】小游戏(键盘版和鼠标版)
  5. 【小白学OpenCV】(零)——计算机图像基础
  6. 海思Hi3519A 基础入门教程
  7. 百度网站优化和360网站优化的排名算法异同之处
  8. WordPress独立下载页面插件
  9. 广州大学 计算机网络实验3 使用网络协议分析器捕捉和分析协议数据包 2020版
  10. nn.Linear()函数详解