二叉树中序遍历(非递归)算法实现--C语言

今天继续二叉树的学习。
昨天写了一遍二叉树的先序遍历(非递归)算法,今天写一下二叉树的二叉树的中序遍历(非递归)算法。中序遍历的非递归算法有两种,但是个人觉得只要掌握一种就可以了,只要自己的逻辑清晰,会哪一种又有什么关系呢~

首先给出今天的二叉树的示例图:
在这里插入图片描述

代码如下:


#include "stdafx.h"
#include <stdlib.h>
#define STACKINITSIZE 20//栈初始空间大小
#define INCREASEMENT 10//栈空间大小的增量typedef struct BiTNode
{char data;//二叉树节点数据BiTNode *lchild,*rchild;//指向二叉树左子树和右子树的指针
}BiTNode,*BiTree;//定义二叉树节点结构typedef struct SqStack
{BiTNode *base;//栈底指针BiTNode *top;//栈顶指针int stacksize;//顺序栈空间大小
}SqStack;//定义顺序栈结构//建立一个空栈,建立成功,返回1,失败,返回0
int InitStack(SqStack &S)
{S.base = (BiTNode*)malloc(STACKINITSIZE * sizeof(BiTNode));//20为栈的大小,可以更改if(!S.base)return 0;S.top = S.base;S.stacksize = STACKINITSIZE;return 1;
}//进栈操作
int Push(SqStack &S,BiTNode e)
{if(S.top - S.base >= S.stacksize){S.base = (BiTNode*)realloc(S.base,(STACKINITSIZE + INCREASEMENT) * sizeof(BiTNode));if(!S.base)return 0;S.stacksize = 30;}*S.top = e;S.top ++;return 1;
}//出栈操作,若栈为空,则返回0;栈不为空,则返回1
int Pop(SqStack &S,BiTNode &e)
{if(S.base == S.top)return 0;S.top --;e = *S.top;return 1;
}//判断栈是否为空,若栈为空,则返回true,栈不为空,则返回false
bool StackEmpty(SqStack S)
{if(S.base == S.top)return true;elsereturn false;
}//建立二叉树
void CreateBiTree(BiTree &T)
{char ch;scanf("%c",&ch);if(ch == '#')T = NULL;else{T = (BiTNode *)malloc(sizeof(BiTNode));T->data = ch;CreateBiTree(T->lchild);CreateBiTree(T->rchild);}
}
//中序遍历二叉树
int InOrderTraverse(BiTree T)
{if(!T)return 0;SqStack S;int n = InitStack(S);//建立空栈if(!n)return 0;BiTree p = T;BiTNode e;//二叉树节点,用于存放从栈中取出的节点while(p || !StackEmpty(S)){if(p){Push(S,*p);p = p->lchild;}else{Pop(S,e);printf("%c ",e.data);p = e.rchild;}}printf("\n");return 1;
}int main(int argc, char* argv[])
{BiTree T = NULL;printf("请输入二叉树-按照先序序列建立二叉树\n");CreateBiTree(T);printf("中序遍历二叉树结果为:\n");InOrderTraverse(T);return 0;
}

测试结果:
在这里插入图片描述
代码相对于先序遍历来说,几乎改动不大,只在遍历函数里有改动。但是,为了多练习,还是应该再敲一遍,说不定会有新的启发。对于C语言,自己可能还是刚入门阶段,但是不去多练习,又怎么会有提高呢!就像做数学题一样,自己觉得看着都会,却又不去动手去做,那在真正考试的时候,很可能的结果就是大部分题目都做不出来。究其原因当然是平时动手太少,觉得自己都会而懒于去做。
写代码也是一样,之前看的时候觉得自己道理都懂,但是昨天自己心血来潮,想建立一个空栈竟然都成问题,当时内心感慨颇多,学了这么多年计算机,竟然到现在把最简单的东西都忘得差不多了。所以决定给自己定下小目标,每天至少更新一篇博客:博客上要附上自己今天敲的代码。无论自己是否从事这类的工作,都要坚持下去!虽然不能说自己有多么的喜欢这些内容,但是至少在敲代码的时候自己的内心是平静的!

关于二叉树的一些原理什么的,在更新完相应的内容之后会做一个汇总,形成知识框架,不止为了记录在博客上,也是为了更好的印在脑海里!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/253799.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

一眼看出二叉树中序遍历结果的诀窍

目录 1.二叉树2.二叉排序树&#xff08;搜索树&#xff09; 1.二叉树 方法&#xff1a;在二叉树下画一条线作为X轴&#xff0c;把所有节点投影到X轴上&#xff0c;从左到右排列好&#xff0c;得到的结果就是中序遍历的结果。 例如&#xff1a; 得到“HDIBEAFJCG”是中序遍历…

二叉树中序遍历(递归+非递归)Java

目录 一、结构二、遍历二叉树1.中序遍历&#xff08;递归&#xff09;代码图解 2.中序遍历&#xff08;非递归&#xff09;代码图解 一、结构 二、遍历二叉树 这块内容是二叉树最核心的部分。不但要掌握七种遍历的写法&#xff0c;前、中、后序的递归、非递归写法层次遍历&…

基本题型记录-二叉树中序遍历

由于本人基础较差&#xff0c;所以针对部分题型做一个记录&#xff0c;以免自己忘记 1、二叉树中序遍历 这个遍历方法可以搜一下博客上很多讲解&#xff0c;这里主要是记录一下代码实现&#xff0c;以下面的二叉树为例子 结果应该是 2、迭代法 2.1 遍历过程 这里借用了…

C++算法二叉树中序遍历

非递归中序遍历二叉树思路&#xff08;借助栈实现&#xff09;&#xff1a; 1、依次将所有左子节点压栈&#xff0c;直至为空&#xff1b; 2、弹出栈顶元素&#xff0c;访问栈顶&#xff0c;将栈顶的右子节点压栈&#xff0c;返回步骤1&#xff1b; 3、直至栈空。 &#xff08;…

详解二叉树的中序遍历

中序遍历&#xff1a;首先遍历左子树&#xff0c;然后访问根节点&#xff0c;最后遍历右子树&#xff08;左->根->右&#xff09; 中序遍历的递归算法 思路&#xff1a; 遍历左子树访问根节点遍历右子树 代码如下&#xff1a; //二叉树的中序遍历&#xff08;递归&a…

二叉树的中序遍历算法

一&#xff0c;简介 二叉树的中序遍历在计算机行业有着重要的作用&#xff0c;其中一个应用就是判断一棵二叉树是否二叉排序树。 下面介绍递归和非递归两种方式实现中序遍历。 二&#xff0c;递归实现 递归实现非常简单&#xff0c;左根右依次进行即可。 void mid_scan2(n…

二叉树中序遍历的三种方法

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

(数据结构)二叉树中序遍历

二叉树中序遍历 二叉树中序遍历的实现思想是&#xff1a; 访问当前节点的左子树访问根节点访问当前节点的右子树 图 1 二叉树 以上图 1 为例&#xff0c;中序遍历的过程如下&#xff1a; 访问该二叉树的根节点&#xff0c;找到 1遍历节点 1 的左子树&#xff0c;找到节点 2遍…

二叉树的先序、中序、后序以及层次遍历

二叉树的先序、中序、后序以及层次遍历 方法&#xff1a;在遍历二叉树的时候&#xff0c;一个节点的遍历我们把它看做要经过它三次(下图红色区域)。 当经过一次&#xff0c;被写出来的点&#xff0c;我们称它为先序遍历。 当经过两次&#xff0c;被写出来的点&#xff0c;我…

(数据结构)二叉树后序遍历

二叉树后序遍历 二叉树后序遍历的实现思想是&#xff1a; 访问当前节点的左子树访问当前节点的右子树访问根节点 图 1 二叉树 以上图 1 为例&#xff0c;后序遍历的过程如下&#xff1a; 从根节点 1 开始&#xff0c;遍历该节点的左子树&#xff08;以节点 2 为根节点&#…

二叉树的中序遍历

二叉树文章系列&#xff1a; 二叉树的前序遍历二叉树的中序遍历二叉树的后序遍历二叉树的层序遍历二叉树的前序、中序、后序、层序遍历【解法完整版】 本文目录 一、解题思路&#xff1a;递归二、解题思路&#xff1a;迭代 二叉树的中序遍历的记忆法则是“左根右"&#x…

MySQL基础- 多表查询 和 事务

目录 多表查询多表关系多表查询概述多表查询的分类内连接外连接自连接联合查询union&#xff0c;union all子查询标量子查询列子查询行子查询表子查询 综合练习小结 事务事务简介事务的操作四大特性ACID并发事务问题事务的隔离级别小结 多表查询 之前的SQL语句里的DQL只能进行…

【C++入门】什么是引用

目录 一、引用概念 二、引用特性 三、常引用 四、使用场景 1. 做参数 2. 做返回值 五、传值&#xff0c;传引用效率比较 六、引用和指针的区别 一、引用概念 引用不是新定义一个变量&#xff0c;而是给已存在变量取一个别名&#xff0c;编译器不会为引用变量开辟内存空间…

C++ 函数对象 详解

目录 &#x1f914;函数对象&#xff1a; &#x1f914;本质&#xff1a; &#x1f914;特点&#xff1a; 代码示例&#xff1a; 运行结果&#xff1a; &#x1f914; 内置函数对象&#xff1a; 1.算数仿函数 代码示例&#xff1a; 运行结果&#xff1a; 2.关系仿函数 …

华为OD机试真题B卷 Java 实现【字符串分隔】,附详细解题思路

一、题目描述 输入一个字符串&#xff0c;请按长度为8拆分每个输入字符串并进行输出&#xff0c;长度不是8整数倍的字符串请在后面补数字0&#xff0c;空字符串不处理。 二、输入描述 连续输入字符串(每个字符串长度小于等于100)。 三、输出描述 依次输出所有分割后的长度…

如何查看Steam的17位Id

方法/步骤 1、点击左上角Stream中的设置 2、 进入后点击“界面”&#xff0c;勾选“当可用时显示steam URL 地址栏”。 3、最后点击“查看个人资料”后17位即为ID。

steam注册模拟注册

代替手动模拟注册steam帐号

账号的注册

给账号注册&#xff0c;主要是给数据库中添加一个账号类数据&#xff0c;如图是以userName为用户名和password为密码的数据列表&#xff1a; 给用户和密码添加新的数据就是一个基础的账号注册&#xff0c;下面是页面的主要内容代码样式&#xff1a; 给相应的元素赋予name值&…

Steam注册遇到CAPTCHA问题,一直注册不了,一个简单的注册办法

这个问题一直解决不了 后来我就用了V.P.eN翻墙在Google Chrome上粘贴进入网址再注册就巨快 我自己用的一个很简洁&#xff0c;好用免费的VPeN叫白鲸 V.P.eN下载网址&#xff1a;https://www.bjch110.com/?mid1003 下载安装都很简单 然后白鲸显示连接上后&#xff0c;就打开Goo…

怎样注册邮箱账号?

邮箱账号的注册可以按照以下2种途径&#xff1a; 一、Web端注册 1、网页端搜索&#xff1a;http://163.net&#xff0c;点击“立即注册” 2、4个邮箱套餐&#xff0c;可以根据自己的使用情况进行选择 3、填写申请的邮箱账号&输入密码&#xff0c;手机号码&#xff0c;完…