二叉树遍历之中序遍历算法(非递归、递归)入门详解
一、引言
二叉树的遍历常见的方法有先序遍历、中序遍历、后序遍历和层次遍历等,本文给出了C语言版本的中序遍历二叉树的非递归算法和递归算法。
中序遍历的原理很简单,也就是把树根的访问放在中间。访问结点的次序是:“左—>根—>右”,也就是首先访问左子树,之后访问树根,最后访问右子树。对于左、右子树而言,其访问的次序依然是“左—>根—>右”。
不要小看这里的次序发生的改变,其实具体的实现方式比先序遍历也要麻烦了。
二叉树的中序遍历与先序遍历一样,都可以通过递归算法实现,也可以通过非递归算法实现。
二、二叉树的中序遍历详细演示过程
1、假设二叉树(左右子树全)如下图所示:
2、假设二叉树(没有右子树)如下图所示:
3、假设二叉树(没有左子树)如下图所示:
4、对于稍微复杂一点的二叉树,如下图所示:
其中序遍历过程演示如下(“左—>根—>右”)
三、先序遍历二叉树的代码:
1、算法具体实现思路
从树根开始依次向左走,见到一个结点就入栈一个,直到踏空,然后栈顶结点弹栈,弹栈结点立即访问,之后沿着该结点向右走一步,然后重复前面的动作一路向左。
2、递归算法
void InorderSearch( BiTree *T )
{if( T != NULL ){InorderSearch( T->Lchild );
#ifdef CHARprintf( "%5c\n", T->data );
#elseprintf( "%5d\n", T->data );
#endif InorderSearch( T->Rchild );}
}
2、非递归算法
void InorderSearch( BiTree *T )
{BiTree *stack[MAX_NODE], *p = T;int top = 0;if (T==NULL) {printf( "二叉树为空." );return;}while( p != NULL || top > 0 ){if( p != NULL )//遇到非空结点即压栈,之后一路向左 {stack[top++] = p; p = p->Lchild;}else//遇到空节点则弹栈,访问,向右一步走 {p = stack[--top];
#ifdef CHARprintf( "%5c\n", p->data );
#elseprintf( "%5d\n", p->data );
#endif p = p->Rchild;} }
}
补充:至此,已经完成了二叉树的创建的三种不同方法、二叉树遍历的两种方法。对于中序遍历,其实还有很多方法,但是笔者比较喜欢上述方法,两个字“简单”。
二叉树遍历之中序遍历算法(非递归、递归)入门详解相关推荐
- 二叉树遍历之中序遍历
二叉树遍历之中序遍历 二叉树的中序遍历与深度优先搜索很类似,对于深度优先算法,我们使用栈(Stack),广度优先搜索使用队列(Queue).二叉树的中序遍历遵循三个步骤 遍历左树 访问根节点 遍历右数 ...
- 二叉树遍历之后序遍历(非递归、递归)入门详解
一.引言 二叉树的遍历常见的方法有先序遍历.中序遍历.后序遍历和层次遍历等,本文给出了C语言版本的后序遍历二叉树的非递归算法和递归算法. 后序遍历不如先序遍历简单,是相对最复杂的一种遍历方法.访问结点 ...
- 计算二叉树深度算法(递归、非递归)入门详解
一.引言 二叉树在应用时,经常需要知道二叉树的深度.二叉树的深度就是二叉树的层数,即从树根算起,到最底下一层的层数是多少,即二叉树中结点的最大层次值. 本文给出了计算二叉树深度的算法,包括递归算法和非 ...
- 二叉树的中序遍历 递归与非递归
94. 二叉树的中序遍历 给定一个二叉树的根节点 root ,返回它的 中序 遍历. 示例 1: 输入:root = [1,null,2,3] 输出:[1,3,2] 示例 2: 输入:root = [ ...
- 二叉树的先序遍历(非递归)
虽然递归简单理解,但是用递归内存开销大,耗时长,性能往往不如非递归方式 所以这里通过栈,用非递归方法实现二叉树的先序遍历 二叉树的存储结构定义: typedef struct node{int dat ...
- 二叉树的中序遍历非递归方法(算法导论第三版12.1-3)
二叉树的中序遍历非递归方法(算法导论第三版12.1-3) 1⃣️用栈实现 template<typename T> void inorder_tree_walk_non_recursion ...
- 二叉树的后序遍历(递归和非递归)
二叉树的后序遍历 后序遍历(LRD)是二叉树遍历的一种,也叫做后根遍历.后序周游,记为左右根,简记:左右根. 步骤(非递归): ⼆叉树的后序遍历顺序是左-右-根.在这里仍然采用棧来进行辅助,具体步骤如 ...
- 非递归遍历二叉树(后序遍历)
非递归遍历二叉树(后序遍历) 在二叉树的遍历中,分为递归遍历与非递归遍历.非递归遍历的执行效率较高,时间复杂度小,因此采用非递归遍历有利于提高代码运行效率. //后序遍历非递归实现 void Post ...
- 数据结构与算法之二叉树的先序遍历,中序遍历,后序遍历
数据结构与算法之二叉树的先序遍历,中序遍历,后移遍历 目录 实现二叉树的先序,中序,后序遍历,包括递归方式和非递归方式 在二叉树中找到一个节点的后继节点 1. 实现二叉树的先序,中序,后序遍历,包括递 ...
最新文章
- 动态路由协议RIP的基本原理与配置
- Windoes 远程桌面 对windows 传送大文件(镜像等)
- 15+ tar command usages with examples – Unix/Linux--reference
- 如何在ashx页面获取Session值
- nettry 入站事件如何传递到下一个handler
- AJax错误WebForm1没有定义的javascript错误的解决方法
- yum grouplist 安装gnome桌面环境
- 让Windows 7安装更快速.
- 兄弟HL-1118加粉清零
- 408考研经验分享(待更
- python操作微信电脑版_python操作微信客户端:WechatPCAPI库实现自动化回复
- 抖音极速版/快手极速版自动浏览
- Mac securecrt 破解版安装
- VScode输入感叹号无法生成HTML模板
- 一文详解车道线检测技术分析
- 【论文排版术】学习笔记1
- Linux系统load average异常值处理的trick
- 使用GameMaker中用于碰撞检测的脚本小记
- python读取word文档并做简单的批量文档筛选
- python epub 精品_如何利用Python打包HTML页面为epub?
热门文章
- 20162316刘诚昊 17年10月9日测验“排序课堂测试”
- Apriori算法详解及手写案例
- 接商城类私活就靠他了,前后端都有
- 【路径规划-TSP问题】基于蚁群算法求解旅行商问题含Matlab代码
- 数据结构—二叉树线索化(线索化的先序、中序、后序遍历)
- QuaggaJS在给定图像中定位条形码的工作原理
- 混合云网络怎么组网搭建?
- Java驻场开发是什么?有什么好处
- 如192.168.1.10/27 IP斜杠后面的27是什么意思?
- 五洲御瓷精彩绽放2020第八届特色酒店案例分享论坛暨十周年庆典