我们从两个方向讲解二叉树的中序遍历(递归+迭代)

一.递归

思想:

从根节点开始向其的左孩子遍历,一直访问每个节点的左孩子,当其走到NULL时返回,返回时记录每个节点的数值,然后访问该节点的右孩子,如果为NULL直接返回上一层,如果不为NULL则重复上面的操作,直到遍历完所有的节点为止.

代码如下:

void BTreeInOrder(struct TreeNode* root,int* arry,int* returnSize){//中序遍历if(NULL==root){//判出条件return;}BTreeInOrder(root->left,arry,returnSize);arry[(*returnSize)++]=root->val;BTreeInOrder(root->right,arry,returnSize);
}

具体运行过程:(如图)

二. 迭代:

思想:(前序遍历是入栈时记录结点数值(具体可看我之前写的前序遍历),中序遍历是出栈时记录结点数值)

我们根据上面知道递归的过程是如何进行的,所以可以使用栈来模仿这个过程,从而使用迭代实现二叉树的中序遍历,第一个循环从根节点开始进行入栈,每次让栈顶元素的左孩子入栈直到栈顶元素为NULL时进入下一个循环,先将NULL出栈,然后记录栈顶元素的数值和地址再将其出栈,之后将这个记录的元素的右孩子入栈,为NULL则继续第二个循环,不为NULL则退出第二个循环,继续进行第一个循环,直到所有的结点访问完为止.

代码如下:

typedef struct TreeNode BTNode;typedef struct Stack{//C语言中没有栈,所以我自己定义个栈的结构体方便后面使用BTNode* a_[100];//存储结点的指针数组int size;//数组长度
}Stack;void StackPush(Stack* b,BTNode* root){//入栈b->a_[b->size++]=root;
}void StackPop(Stack* b){//出栈b->size--;
}int* inorderTraversal(struct TreeNode* root, int* returnSize){//中序遍历int* a=(int*)malloc(sizeof(int)*100);//动态创建数组用来存储遍历时的结点数值if(NULL==a){printf("申请节点失败!\n");return NULL;}Stack b;//创建栈变量int i=0;BTNode* root_temp;//创建一个指针变量用来记录出栈时的栈顶元素b.size=0;//初始化栈StackPush(&b,root);//先将根节点入栈while(NULL != b.a_[b.size-1]){//第一个循环StackPush(&b,b.a_[b.size-1]->left);//将栈顶元素的左孩子入栈,直到栈顶为NULL时进入
//下一个循环while(NULL == b.a_[b.size-1]){//第二个循环StackPop(&b);//向将NULL出栈if(0==b.size){//判断是否访问完所有结点(*returnSize)=i;return a;}a[i++]=b.a_[b.size-1]->val;//记录栈顶元素的值root_temp=b.a_[b.size-1];//记录栈顶元素的地址StackPop(&b);//将栈顶元素出栈StackPush(&b,root_temp->right);//将记录的元素的右孩子入栈,继续进行循环}}(*returnSize)=i;return a;
}

具体运行过程:(如图)

二叉树的中序遍历(C语言)相关推荐

  1. 二叉树的后序遍历(C语言)

    首先我们从两个方面讲解二叉树的后序遍历(递归+迭代) 一.二叉树的后序遍历.(递归) 思想: 首先我们从二叉树的根节点开始先遍历其左孩子,①接着同样继续遍历其左孩子的左孩子,直到某个左孩子节点的左孩子 ...

  2. 二叉树建立及中序遍历C++语言实现

    二叉树建立及中序遍历C++语言实现: #include<stdio.h> #include<stdlib.h> typedef struct node{//二叉树结点数据结构定 ...

  3. C语言实现二叉树的中序遍历

    二叉树是一种重要的数据结构,对二叉树的遍历也很重要.这里简单介绍三种二叉树中序遍历的方法.二叉树的中序遍历就是首先遍历左子树,然后访问当前节点,最后遍历右子树.对于下面的二叉树,中序遍历结果如下: 结 ...

  4. leetcode 98. 验证二叉搜索树 递归遍历左右子树和中序遍历 c语言解法

    如题: 给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数. 节点的右子树只包含大于当前节点的数. 所有左子树和右子树自身必须也是 ...

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

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

  6. 树结构练习——排序二叉树的中序遍历(二叉搜索树)

    树结构练习--排序二叉树的中序遍历 Time Limit: 1000MS Memory limit: 65536K 题目描述 在树结构中,有一种特殊的二叉树叫做排序二叉树,直观的理解就是--(1).每 ...

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

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

  8. 树结构练习——排序二叉树的中序遍历

    树结构练习--排序二叉树的中序遍历 Description 在树结构中,有一种特殊的二叉树叫做排序二叉树,直观的理解就是--(1).每个节点中包含有一个关键值 (2).任意一个节点的左子树(如果存在的 ...

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

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

最新文章

  1. matlab画梅花,基于Matlab图像素描生成算法究.doc
  2. AgileEAS.NET平台开发实例-药店系统-准备开发环境(上)
  3. java1.8之supplier
  4. word图片自动换行不亮_知网查重时提交pdf检测结果竟然比Word高很多!
  5. Java基础篇:内部类详解
  6. tomcat,eclipse,sts绿色运行
  7. springcloud hystrix实战(二)
  8. 【C语言】C语言初学者常犯的18条错误
  9. leetcode —— 1079. 活字印刷
  10. concurrentHashMap扩容细节
  11. 在优矿(uqer.io)上打开量化投资的黑箱-技术分析篇
  12. 网站域名备案需要怎么做?
  13. excel图片根据表格内容动态变化
  14. 福建地区市场份额最大的调查研究咨询公司
  15. Spec文件中判断是升级or卸载
  16. c语言小鱼的游泳时间,小鱼系列简单题参考代码
  17. 【物理应用】大气辐射和透射率模型及太阳和月亮模型(Matlab代码实现)
  18. 我要拿走你的蜡烛 1004
  19. 《宣州谢眺楼饯别校书叔云》 李白诗两首
  20. 搞了一天存储过程,现在又说历史数据不用处理了。。。

热门文章

  1. CDH 5.14.2 安装部署指南
  2. 【dsPIC33】PWM系列之PWM触发ADC
  3. 顶刊IJCV 2022!华为GhostNet再升级!全系列硬件上最优极简AI网络
  4. Express+NodeJS搭建服务器后台
  5. Statsmodels 统计包之 OLS 回归
  6. python打印等边三角形(实心,空心)
  7. LoadRunner之交叉结果与性能报告生成
  8. 机器学习实战 | AutoML自动化机器学习建模
  9. Windows下通过Kitematic创建mysql instance
  10. 吃瓜教程|Task1(概览西瓜书第1、2章)