二叉树的中序遍历(C语言)
我们从两个方向讲解二叉树的中序遍历(递归+迭代)
一.递归
思想:
从根节点开始向其的左孩子遍历,一直访问每个节点的左孩子,当其走到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语言)相关推荐
- 二叉树的后序遍历(C语言)
首先我们从两个方面讲解二叉树的后序遍历(递归+迭代) 一.二叉树的后序遍历.(递归) 思想: 首先我们从二叉树的根节点开始先遍历其左孩子,①接着同样继续遍历其左孩子的左孩子,直到某个左孩子节点的左孩子 ...
- 二叉树建立及中序遍历C++语言实现
二叉树建立及中序遍历C++语言实现: #include<stdio.h> #include<stdlib.h> typedef struct node{//二叉树结点数据结构定 ...
- C语言实现二叉树的中序遍历
二叉树是一种重要的数据结构,对二叉树的遍历也很重要.这里简单介绍三种二叉树中序遍历的方法.二叉树的中序遍历就是首先遍历左子树,然后访问当前节点,最后遍历右子树.对于下面的二叉树,中序遍历结果如下: 结 ...
- leetcode 98. 验证二叉搜索树 递归遍历左右子树和中序遍历 c语言解法
如题: 给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数. 节点的右子树只包含大于当前节点的数. 所有左子树和右子树自身必须也是 ...
- 《LeetCode力扣练习》第94题 二叉树的中序遍历 Java
<LeetCode力扣练习>第94题 二叉树的中序遍历 Java 一.资源 题目: 给定一个二叉树的根节点 root ,返回它的 中序 遍历. 示例 1: 输入:root = [1,nul ...
- 树结构练习——排序二叉树的中序遍历(二叉搜索树)
树结构练习--排序二叉树的中序遍历 Time Limit: 1000MS Memory limit: 65536K 题目描述 在树结构中,有一种特殊的二叉树叫做排序二叉树,直观的理解就是--(1).每 ...
- LeetCode-二叉树-94. 二叉树的中序遍历
描述 94. 二叉树的中序遍历 给定一个二叉树的根节点 root ,返回它的 中序 遍历. 示例 1: 输入:root = [1,null,2,3] 输出:[1,3,2] 示例 2: 输入:root ...
- 树结构练习——排序二叉树的中序遍历
树结构练习--排序二叉树的中序遍历 Description 在树结构中,有一种特殊的二叉树叫做排序二叉树,直观的理解就是--(1).每个节点中包含有一个关键值 (2).任意一个节点的左子树(如果存在的 ...
- LeetCode 92反转链表Ⅱ93复制ip地址94二叉树的中序遍历
微信搜一搜:bigsai 专注于Java.数据结构与算法,一起进大厂不迷路! 算法文章题解全部收录在github仓库bigsai-algorithm,求star! 关注回复进群即可加入力扣打卡群,欢迎 ...
最新文章
- matlab画梅花,基于Matlab图像素描生成算法究.doc
- AgileEAS.NET平台开发实例-药店系统-准备开发环境(上)
- java1.8之supplier
- word图片自动换行不亮_知网查重时提交pdf检测结果竟然比Word高很多!
- Java基础篇:内部类详解
- tomcat,eclipse,sts绿色运行
- springcloud hystrix实战(二)
- 【C语言】C语言初学者常犯的18条错误
- leetcode —— 1079. 活字印刷
- concurrentHashMap扩容细节
- 在优矿(uqer.io)上打开量化投资的黑箱-技术分析篇
- 网站域名备案需要怎么做?
- excel图片根据表格内容动态变化
- 福建地区市场份额最大的调查研究咨询公司
- Spec文件中判断是升级or卸载
- c语言小鱼的游泳时间,小鱼系列简单题参考代码
- 【物理应用】大气辐射和透射率模型及太阳和月亮模型(Matlab代码实现)
- 我要拿走你的蜡烛 1004
- 《宣州谢眺楼饯别校书叔云》 李白诗两首
- 搞了一天存储过程,现在又说历史数据不用处理了。。。