一,简介

二叉树的中序遍历在计算机行业有着重要的作用,其中一个应用就是判断一棵二叉树是否二叉排序树。

下面介绍递归和非递归两种方式实现中序遍历。

二,递归实现

递归实现非常简单,左根右依次进行即可。

void mid_scan2(node* now)
{if(now->left != NULL)mid_scan2(now->left);cout<<now->num<<",";if(now->right != NULL)mid_scan2(now->right);
}

三,非递归实现

约定:

如果当前二叉树的某个结点没有左(右)孩子,那么该结点的左(右)孩子为NULL。

指针指向的结点,被称为当前结点。

1,实现思路

(1)如果根节点为空,则退出函数,否则将当前指针指向根节点,并进行以下的步骤:

(2)如果当前结点非空,将当前元素压栈,指针向左孩子。循环该步骤直至指针指空。

(3)如果当前指针指空,则:

a,退栈,将指针指向退栈出来的元素,输出这个元素的数据。

b,判断当前结点的右子树是否为空。

b(1) 如果非空,则指针指向当前结点的右孩子,跳转到步骤(2)

b(2)如果为空,退栈,将指针指向退栈出来的元素,输出这个元素的数据。

b(2-2)让指针指向当前结点右子树根结点。

(4)重复执行以上操作。

2,具体代码

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
using namespace std;
typedef struct node0{ int num;node0* left;node0* right;
}node;void layer_scan(node* head,int n)//层次遍历 ,用来验证二叉排序树的生成是否成功
{cout<<"层次遍历的结果:"<<endl; node* queue = (node*)malloc(sizeof(node)*(n+1));//层次遍历所需队列 int size = n+1;int i;int front=0,rear=0;//队空时,front和rear相等;队满时rear的下一个就是front//node* now = (node*)malloc(sizeof(node));queue[rear++] = *head;while(front != rear) {if(queue[front].left != NULL){queue[rear] = *(queue[front].left);rear = (rear + 1)%size;}if(queue[front].right != NULL){queue[rear] = *(queue[front].right);rear = (rear + 1)%size;}cout<<queue[front].num<<",";front = (front + 1)%size;}cout<<endl;
}int* mid_scan(node* head,int n)//中序非递归遍历,并将遍历顺序存储在数组中然后返回
{cout<<"中序非递归遍历的结果是:"<<endl; if(head == NULL){cout<<"该树为空!"<<endl;return NULL; }int* result = (int*)malloc(sizeof(int)*(n+1));//存储结果的栈 node* stack = (node*)malloc(sizeof(node)*(n+1));//实现非递归遍历的栈 int top=0;//stack的栈顶指针 int top2=0;//result的栈顶指针 node* now;//当前指针 now = head;//初始化当前指针 while(top>=0){while(now != NULL)//当前指针非空,那么就入栈,向左子树前进 {stack[top++] = *now;now = now->left;}top--;if(top<0)return result;now = &stack[top] ;//出栈,并让当前指针指向出栈的元素 cout<<now->num<<",";result[top2++] = now->num;if(now->right != NULL)//右子树非空就往右前进一步,然后continue {now = now->right;continue;}else{top--;if(top<0)return result;now = &stack[top] ;cout<<now->num<<",";result[top2++] = now->num;now = now->right;}}return result;
}
void mid_scan2(node* now)//中序递归遍历算法
{if(now->left != NULL)mid_scan2(now->left);cout<<now->num<<",";if(now->right != NULL)mid_scan2(now->right);
}
node* BST_tree(int n)//建立一颗二叉排序树,该二叉树的结点个数为n,结点的值是随机的.
{//中序遍历二叉排序树的结果序列是一个有序序列,该函数最后返回该二叉排序树的根结点指针 node* head;//根结点指针 node* now; int i,num;srand(time(0));//随机改变下面的随机种子 for(i=0;i<n;i++){num = rand() % (n*n);node* p = (node*)malloc(sizeof(node));p->num = num;//cout<<num<<",";if(i==0) {head = p;head->left = NULL;head->right = NULL;}now = head;while(now->left!=NULL || now->right!=NULL)//未到达叶子结点时 {if(p->num > now->num){if(now->right == NULL)break;now = now->right;}else {if(now->left == NULL)break;now = now->left;}}if(p->num > now->num)//该if-else语句用来实现新结点在当前叶子结点的插入 now->right = p;else now->left  = p;p->left = NULL;p->right = NULL;}cout<<endl;return head;//返回根结点指针
}void question_285_06()//验证答案
{int n,i;node* head;int* mid_serial;//接收中序非递归遍历序列 n=10;head = BST_tree(n);//生成二叉排序树 cout<<"层次遍历,验证二叉排序树,"; layer_scan( head, n);//层次遍历,验证二叉排序树的生成是 cout<<"中序递归遍历的结果是:"<<endl;mid_scan2(head);//中序递归遍历 cout<<endl;mid_serial = mid_scan( head, n);//中序非递归遍历序列 cout<<endl;cout<<"mid_serial数组中的内容是:"<<endl;for(i=0;i<n;i++)cout<< *(mid_serial+i)<<",";cout<<endl;
}
int main()
{question_285_06();return 0;
}

运行结果:

如有错误,敬请指正,礼貌交流,感激不尽

二叉树的中序遍历算法相关推荐

  1. 二叉树的中序遍历非递归方法(算法导论第三版12.1-3)

    二叉树的中序遍历非递归方法(算法导论第三版12.1-3) 1⃣️用栈实现 template<typename T> void inorder_tree_walk_non_recursion ...

  2. 图解二叉树非递归版的中序遍历算法

    你会学到什么 讨论的问题是什么 这个问题相关的概念和理论 非递归版中序遍历算法 代码思考 算法技巧 实现代码 快照 评价算法 总结 欢迎关注算法思考与应用公众号 你会学到什么? 树的递归遍历算法很容易 ...

  3. 《LeetCode力扣练习》第94题 二叉树的中序遍历 Java

    <LeetCode力扣练习>第94题 二叉树的中序遍历 Java 一.资源 题目: 给定一个二叉树的根节点 root ,返回它的 中序 遍历. 示例 1: 输入:root = [1,nul ...

  4. LeetCode 92反转链表Ⅱ93复制ip地址94二叉树的中序遍历

    微信搜一搜:bigsai 专注于Java.数据结构与算法,一起进大厂不迷路! 算法文章题解全部收录在github仓库bigsai-algorithm,求star! 关注回复进群即可加入力扣打卡群,欢迎 ...

  5. leetcode - 94. 二叉树的中序遍历

    给定一个二叉树,返回它的中序遍历.中序遍历(LDR)是二叉树遍历的一种,也叫做中根遍历.中序周游.在二叉树中,中序遍历首先遍历左子树,然后访问根结点,最后遍历右子树. 示例: 进阶: 递归算法很简单, ...

  6. LeetCode-94. 二叉树的中序遍历

    题目描述: 给定一个二叉树的根节点 root ,返回它的 中序 遍历. 输入:root = [1,null,2,3] 输出:[1,3,2] 思路分析: 用递归或是迭代算法来解决. 递归: 首先我们需要 ...

  7. Leetcode 129求根节点到叶节点数字之和、104二叉树的最大深度、8字符串转换整数(atoi)、82删除排序链表中的重复元素II、204二分查找、94二叉树的中序遍历、144二叉树的前序遍历

    Top1:Leetcode 129求根节点到叶节点数字之和 官方题解:https://leetcode.cn/problems/sum-root-to-leaf-numbers/solution/qi ...

  8. 二叉树的中序遍历 递归与非递归

    94. 二叉树的中序遍历 给定一个二叉树的根节点 root ,返回它的 中序 遍历. 示例 1: 输入:root = [1,null,2,3] 输出:[1,3,2] 示例 2: 输入:root = [ ...

  9. 每日一题——二叉树的中序遍历

    菜鸡每日一题系列打卡94天 每天一道算法题目 小伙伴们一起留言打卡 坚持就是胜利,我们一起努力! 题目描述(引自LeetCode) 给定一个二叉树,返回它的中序遍历. 示例: 输入: [1,null, ...

  10. 15 二叉树的中序遍历(Binary Tree Inorder Traversal)

    文章目录 1 题目 2 描述 3 解决方案 3.1 递归算法 3.1.1 遍历法(Traverse) 思路 源码 3.1.2 分治法(Devide And Conquer) 思路 源码 3.2 非递归 ...

最新文章

  1. Spring Boot 中的 RestTemplate不好用?试试 Retrofit !
  2. python两个集合的交集 合集 差集
  3. (四)Java B2B2C o2o多用户商城 springcloud架构-断路器(Hystrix)
  4. 四种电荷分布,点电荷,体电荷,面电荷,线电荷
  5. BZOJ——T 1612: [Usaco2008 Jan]Cow Contest奶牛的比赛
  6. php读取excel 报错_php读取excel内存溢出
  7. 七夕烟花c语言程序,C语言七夕必备神器,待那烟花灿烂时,依旧做个单身狗
  8. 网口压线顺序_水晶头压线顺序
  9. 对冲策略及Python实现
  10. 「硬刚Doris系列」Apache Doris的向量化和Roaring BitMap
  11. VC++启动浏览器打开指定网页 (转)
  12. 产品有感之拼多多——社交更优惠的电商平台
  13. Android开发——新建库、删除库
  14. 基于java的点餐微信小程序
  15. 【2017.10.08 智能驾驶/汽车电子】汽车电控常用英文缩写及功能之一
  16. flam3 ubuntu 依赖文件
  17. 汽车美容店管理系统如何管理店铺数据?
  18. 千名德国基尔居民测试疫情警报手环
  19. K210入门-裸机开发(十)之IIC协议_MPU6050六轴陀螺仪
  20. 关于keil软件error:L6236E:NO section matches selector-no section to be FIRST/LAST的报错解决方法

热门文章

  1. flash 火狐总是崩溃_火狐浏览器经常崩溃怎么办,解决Firefox、Flash假死问题
  2. 常见文件编码 - 多字节编码与Unicode编码区别
  3. html仿qq截图,截图工具(仿QQ截图,大致功能都已实现)
  4. 3D点云深度学习综述
  5. python产品管理系统_python实现超市商品销售管理系统
  6. QQ音乐、网易云音乐、虾米音乐们的音乐社区暗战
  7. python数据分析之爬虫七:爬取豆瓣书籍排行榜Top250
  8. python字典题_Python字典练习题
  9. AXI总线学习-------从零开始详细学-------------连载(7)读写处理架构,burst介绍,burst细节定义(burst type burst address)
  10. 分析Windows二进制文件和嵌入式资源