完整代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>typedef struct BiTNode//二叉树的结构体
{char ch;//二叉树的数据域 struct BiTNode *lchild,*rchild;//二叉树的指针域
}BiTNode ,*BiTree;typedef struct StackNode //栈的结构体
{BiTree data;//栈的数据域,(数据域为二叉树的一个结点) struct StackNode *next; //栈的指针域
}SqStack,*LinkStack;void InitStack(LinkStack &S)//栈的初始化,只有创建一个栈顶结点这一步
{S = (SqStack*)malloc(sizeof(SqStack));//创建一个野结点,使其为NULL,便成为栈顶结点。 S = NULL;
}int Push(LinkStack &S,BiTree T)//进栈
{SqStack* p;//定义一个野结点 p = (SqStack*)malloc(sizeof(SqStack));p->data = T;//使该结点装上数据元素T,并使其next等于S,类似于链表的头插法 p->next = S;S = p;//栈顶结点S,一直在栈的最前方 return 0;
}void Pop(LinkStack &S,BiTree &T)//使栈顶元素出栈,并返回栈顶元素
{if(S==NULL)//判断栈是否为空 {printf("栈空!");}else{SqStack* p;//这里定义一个结点,方便后面对栈顶结点的释放 T = S->data; // p = S;S = S->next;//使栈顶结点指向下一个结点,类似于栈减一 free(p);//释放栈顶元素 }
}void CreateTree(BiTree &T)//创建二叉树,这里是先序遍历的顺序建立的二叉链表  递归形式
{char ch,trmp;scanf("%c",&ch);//输入链表数据 if(ch == '#')//如果出现输入的是#,终止递归。终止递归条件 T = NULL;else{T = (BiTNode*)malloc(sizeof(BiTNode));//申请一个根结点 T->ch = ch;//对根结点进行赋值 CreateTree(T->lchild);//递归创建左子树 CreateTree(T->rchild);//递归创建右子树 }
}void InOrderTraverse(BiTree T)//中序遍历二叉树T的非递归算法
{LinkStack S;InitStack(S);//创建一个栈,并初始化 BiTree p = T;BiTree q = (BiTNode*)malloc(sizeof(BiTNode));//创建结点q,并为其申请空间 while(p || S!=NULL)//循环终止条件是p为NULL与S等于NULL,两个条件同时满足的情况下,循环终止 {if(p)//p非空 {Push(S,p);//根指针进栈 p = p->lchild;//遍历左子树 }else{Pop(S,q);//出栈 printf("%c ",q->ch);//访问根结点 p = q->rchild;//遍历右子树 }}
}int main()
{BiTree T;CreateTree(T);//创建一个二叉树 InOrderTraverse(T);//非递归中序遍历二叉树 printf("\n");return 0;
}

结果演示:

(完)

C语言 中序遍历二叉树--非递归算法相关推荐

  1. 二叉树中序遍历的非递归算法

    根据二叉树的先序遍历结果创建一棵二叉树,即先创建根结点,然后再创建左子树,最后创建右子树,对于左右子树的创建也遵循根左右的原则,所以对于左右子树的创建可以递归调用本函数,此问题是典型的需要用递归算法求 ...

  2. 数据结构-----后序遍历二叉树非递归算法(利用堆栈实现)

    一.非递归后序遍历算法思想 后序遍历的非递归算法中节点的进栈次数是两个,即每个节点都要进栈两次,第二次退栈的时候才访问节点. 第一次进栈时,在遍历左子树的过程中将"根"节点进栈,待 ...

  3. 中序遍历二叉树-非递归方式实现-附C++代码

    一.问题描述 给定一个二叉树,要求以非递归的方式进行中序遍历. 原题:二叉树的中序遍历 - leetcode 二.解题思路 首先需要知道一些前置知识:中序遍历是指按 左子树 -> 根节点 -&g ...

  4. 中序遍历的非递归算法

    void inordertraverse(bitree t) {initstack(s); p = t;q = new bitnode;while (p || !stackempty(s)){if ( ...

  5. 中序遍历二叉树非递归

    用栈 void inOrder(Node *root){stack<Node*> st;Node *p = root;if(root == NULL)return ;else{st.pus ...

  6. (※)中序遍历二叉树的非递归算法

    在此之前,我们已经学习了中序遍历二叉树的递归算法,相信大家已经将其牢牢掌握了. 除了使用递归思想作为求解问题的钥匙,还可以借助栈来以非递归方式实现该问题的求解. 首先,我们要讨论存储二叉树结点信息的栈 ...

  7. 二叉树后序遍历的非递归算法

    二叉树的后序遍历的非递归算法与二叉树的先序和中序遍历的非递归算法相比稍微复杂一点. 大致思路是:如果当前结点左右子树均为空,则可以访问当前结点,或者左右子树不均为空,但是前一个访问的结点是当前结点的左 ...

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

    中序遍历二叉树(递归) void inOrder(BT* root) {if (root == NULL)return;inOrder(root->lchild);cout << & ...

  9. 中序遍历二叉树的非递归实现(利用栈)

    中序遍历二叉树的非递归实现 之前的博客写了递归的实现,说白了也就是不断自己调用自身,保持左根右的顺序.只需写出整体逻辑结构,程序会自己递归复杂的过程,大体即为: void inTraverseByRe ...

最新文章

  1. C++ 笔记(26)— 主函数 main(int argc, char *argv[]) 参数说明
  2. 牛逼!用 12 万行代码堆出来个 蔡徐坤,编译还能通过!
  3. 1.Pytorch Basics
  4. 使用logon trigger完成动态的session跟踪
  5. appium的demo编程
  6. python自学什么书比较好-如何自学Python ?自学看什么书比较好?
  7. php拍照从手机相册中选择,Android获取图片:拍照和从相册中选择
  8. redis hash
  9. java nextintln_java – 从lambda表达式引用的局部变量必须是final或者有效的final
  10. 数据库事务(Database Transaction)
  11. 谷歌为何会选用TypeScript?
  12. 调用另外一个文件_从零开始学Python-Day52-文件读写
  13. 微擎url模式解读_微擎系统全局变量说明 - 微擎(WEIQING) – 黑锐源码社区 – bbs.heirui.cn...
  14. windows下的内存型下载者病毒
  15. Ceph OSD简介
  16. 离散题目16——自反闭包
  17. 10大顶级运营商转型案例剖析
  18. 全网最详细的Yolov3训练Caltech Pedestrain数据集并绘制fppi miss rate图
  19. linux 下载百度网盘资源 centos安装aria2
  20. MODBUS RTU转PROFIBUS DP 转换器怎么接线远创智控

热门文章

  1. 来评测下:OPPOK7x和畅享20哪个好
  2. skew算法_CSS3 transform 属性详解(skew, rotate, translate, scale)
  3. ChIP-seq文章 | Frontiers in Plant Science发表揭示青稞对白粉病的抗性机制
  4. C++13-STL模板
  5. 【c语言】二进制文件的读写操作
  6. useCallback的使用背景
  7. Kindred AI要让人戴VR眼镜训练机器人 使其变聪明
  8. 第2章 Python语言基础
  9. C# 程序设计之猜猜看
  10. somatic和germline突变有什么区别