#include<stdio.h>
#include<stdlib.h>typedef char ElemType;
typedef char DataType;
//二叉链表存储结构
typedef struct BiTNode
{DataType data;struct BiTNode *lchild;struct BiTNode *rchild;
}BiTNode,*BiTree; //BiTNode为结点类型,BiTree为指向二叉链表结点的指针类型
//栈的数据类型
typedef struct
{BiTree ptr;   //指向根节点的指针int task;     //任务性质,1表示遍历,0表示访问
}SElemType;//顺序栈的存储结构typedef struct stack
{SElemType *data;int top;        //指示栈顶的位置int stackSize;    //栈的容量
}SqStack;
//1.栈的初始化
int initStack(SqStack *S,int max)
{S->data=(SElemType *)malloc(max*sizeof(SElemType));if(!S->data){printf("空间申请失败!");exit(0);}S->top=-1;S->stackSize=max;return 1;
}//2.判断栈空
int StackEmpty(SqStack S)
{if(S.top==-1) return 1; //栈空返回1else return 0;
}//5.进栈
int Push(SqStack *S,SElemType e)
{if(S->stackSize==S->top+1) return 0;S->top++;S->data[S->top]=e;return 1;
}//6.出栈
int Pop(SqStack *S,SElemType *e)
{if(S->top==-1) return 0;*e=S->data[S->top];S->top--;return 1;
}
//DLR
void preorder(BiTree T)
{SqStack S;BiTree p;SElemType e;initStack(&S,100);e.ptr=T;e.task=1;if(T){Push(&S,e);}  //有根结点布置初始任务while(!StackEmpty(S)){Pop(&S,&e);              //每次处理一项任务if(e.task==0)printf("%c",e.ptr->data); //如果e.task==1,永远只会打印根结点else{e.task=0;Push(&S,e);          //访问根结点p=e.ptr;e.ptr=p->lchild;e.task=1;if(e.ptr){Push(&S,e);}         //遍历左子树    e.ptr=p->rchild;if(e.ptr)  {Push(&S,e);}        //遍历右子树}}
}
//LDR
void inorder(BiTree T)
{SqStack S;BiTree p;SElemType e;initStack(&S,100);e.ptr=T;e.task=1;if(T){Push(&S,e);}  //有根结点布置初始任务while(!StackEmpty(S)){Pop(&S,&e);              //每次处理一项任务if(e.task==0)printf("%c",e.ptr->data); //如果e.task==1,永远只会打印根结点else{p=e.ptr;e.ptr=p->rchild;if(e.ptr){Push(&S,e);}         //遍历左子树e.ptr=p;e.task=0;Push(&S,e);          //访问根结点e.ptr=p->lchild;e.task=1;if(e.ptr)  {Push(&S,e);}        //遍历右子树}}
}
//LRD
void postorder(BiTree T)
{SqStack S;BiTree p;SElemType e;initStack(&S,100);e.ptr=T;e.task=1;if(T){Push(&S,e);}  //有根结点布置初始任务while(!StackEmpty(S)){Pop(&S,&e);              //每次处理一项任务if(e.task==0)printf("%c",e.ptr->data); //如果e.task==1,永远只会打印根结点else{p=e.ptr;e.ptr=p->lchild;if(e.ptr){Push(&S,e);}         //遍历左子树e.ptr=p->rchild;if(e.ptr)  {Push(&S,e);}        //遍历右子树e.ptr=p;e.task=0;Push(&S,e);          //访问根结点}}
}
void main()
{BiTree T=(BiTree)malloc(sizeof(BiTNode));//初始化一个二叉树,其根节点是A,没有左右孩子T->data='A';T->lchild=NULL;T->rchild=NULL;inorder(T);printf("\n");T->lchild=(BiTree)malloc(sizeof(BiTNode));T->lchild->data='B';T->lchild->lchild=NULL;T->lchild->rchild=NULL;T->rchild=(BiTree)malloc(sizeof(BiTNode));T->rchild->data='C';T->rchild->lchild=NULL;T->rchild->rchild=NULL;inorder(T);printf("\n");T->lchild->lchild=(BiTree)malloc(sizeof(BiTNode));T->lchild->lchild->data='D';T->lchild->lchild->lchild=NULL;T->lchild->lchild->rchild=(BiTree)malloc(sizeof(BiTNode));T->lchild->lchild->rchild->data='G';T->lchild->lchild->rchild->lchild=NULL;T->lchild->lchild->rchild->rchild=NULL;T->rchild->lchild=(BiTree)malloc(sizeof(BiTNode));T->rchild->lchild->data='E';T->rchild->lchild->lchild=NULL;T->rchild->lchild->rchild=NULL;T->rchild->rchild=(BiTree)malloc(sizeof(BiTNode));T->rchild->rchild->data='F';T->rchild->rchild->lchild=NULL;T->rchild->rchild->rchild=NULL;printf("先序遍历:");preorder(T);printf("\n");printf("中序遍历:");  inorder(T);printf("\n");printf("后序遍历:");postorder(T);printf("\n");
}

运行结果

中序遍历是教材上给的,与实际情况吻合,先序遍历和后续遍历是自己改动的,运行结果与实际情况相反,先序遍历本该是ABDGCEF

基于任务分析的非递归遍历二叉树相关推荐

  1. 【转】更简单的非递归遍历二叉树的方法

    [转]更简单的非递归遍历二叉树的方法 解决二叉树的很多问题的方案都是基于对二叉树的遍历.遍历二叉树的前序,中序,后序三大方法算是计算机科班学生必写代码了.其递归遍历是人人都能信手拈来,可是在手生时写出 ...

  2. 更简单的非递归遍历二叉树

    解决二叉树的很多问题的方案都是基于对二叉树的遍历.遍历二叉树的前序,中序,后序三大方法算是计算机科班学生必写代码了.其递归遍历是人人都能信手拈来,可是在手生时写出非递归遍历恐非易事.正因为并非易事,所 ...

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

    二叉树的递归算法虽然简单,但是会导致时间复杂度比较高,下面给大家带来用栈实现的二叉树非递归算法 首先定义好二叉树,和元素类型为二叉树的栈 typedef struct BiTNode{TElemTyp ...

  4. 非递归遍历二叉树(算法导论第三版第十章10.4-5)

    非递归遍历二叉树(算法导论第三版第十章10.4-5) template<typename T> void TraverseBinaryTreeNonRecursive(BinaryTree ...

  5. 数据结构专题 | 先序非递归遍历二叉树

    先序非递归遍历二叉树,主要是利用了栈的先进后出原理,用一个栈即可实现该算法,下面我们一起来看一下如何来实现吧 目录 先序建立二叉树 先序递归遍历二叉树 先序非递归遍历二叉树 先序建立二叉树 在进行先序 ...

  6. 非递归遍历二叉树实现和理解

    非递归遍历二叉树 1.前言 ​ 总所周知,二叉树的遍历分为先序遍历.中序遍历和后序遍历.遍历的顺序不同,则结果不同.而遍历方法也分递归和非递归.而二者的复杂度相同:时间复杂度为O(nlgn),空间复杂 ...

  7. 非递归遍历二叉树(后序遍历)

    非递归遍历二叉树(后序遍历) 在二叉树的遍历中,分为递归遍历与非递归遍历.非递归遍历的执行效率较高,时间复杂度小,因此采用非递归遍历有利于提高代码运行效率. //后序遍历非递归实现 void Post ...

  8. C++实现递归,非递归遍历二叉树(前序,中序,后序)

    初学二叉树那会儿,始终掌握不好二叉树的遍历方法,更认为非递归遍历晦涩难懂没有掌握的意义.实际上非递归的遍历方法很有用处,由于每次递归都需要将函数的信息入栈,当递归层数太深很容易就导致栈溢出,所以这个时 ...

  9. 数据结构_非递归遍历二叉树(C语言)

    数据结构总目录 非递归遍历二叉树 1. 图文解析 对于链式二叉树,如果要用非递归的方式进行前.中.后序遍历,则需要借助一个栈实现,而层序遍历则需要借助队列来实现. 构建如下二叉树: 非递归先序遍历 ( ...

  10. 更简单的非递归遍历二叉树的方法

    解决二叉树的很多问题的方案都是基于对二叉树的遍历.遍历二叉树的前序,中序,后序三大方法算是计算机科班学生必写代码了.其递归遍历是人人都能信手拈来,可是在手生时写出非递归遍历恐非易事.正因为并非易事,所 ...

最新文章

  1. python 图像识别_python图像识别之图片相似度计算
  2. 交换一个整数二进制表示中的奇数位和偶数位
  3. python数据库管理实例_西游之路——python全栈——学员管理实例之数据库设计
  4. 剑指Offer——网易笔试之解救小易
  5. 数据库中的goto语法
  6. opencv mat数据剪裁感兴趣的部分处理方法
  7. xss绕过字符过滤_XSS绕过实战练习
  8. string 类的常用方法 substring indexof length
  9. java怎么让main方法不退出_JAVA线程池原理源码解析—为什么启动一个线程池,提交一个任务后,Main方法不会退出?...
  10. Capture One Pro 22 for Mac(RAW图像处理软件)v15.1.2.1
  11. js基础——function类型
  12. [LeetCode] Reverse Linked List 倒置链表
  13. mysql更改密码_Mysql更改密码、连接mysql、mysql常用命令
  14. CV进阶 -- 目标检测原理及代码实现、YOLO源码解读学习
  15. 教妹学Java(十):Unicode字符集简介
  16. c++ 开根号程序 算法实现 C++函数同时返回两个值
  17. 可编程串行通信接口芯片8251A
  18. Java内存泄漏检测工具 JRockit Memory Leak Detector
  19. java安装_Java开发人员应该知道的7种新工具
  20. Basset: learning the regulatory code of the accessible genome with deep convolutional neural network

热门文章

  1. [翻译]Visual Odmetry from scratch - A tutorial for beginners
  2. 【车道线检测与寻迹】2月13日 CV导论+数字图像处理与opencv实践+canny边缘检测
  3. 设计模式-结构型模式(读书笔记)
  4. NoSQL、memcached介绍、安装memcached、查看memcached状态
  5. DEDE中如何过滤掉Html标签,并且截取字符串长度
  6. (H2与HBase)面向行or面向列的存储模型?
  7. 《机电传动控制》第六周学习笔记
  8. SOA的关键是什么?
  9. C语言基础课第三次作业
  10. 11/27 记事本