题目

实现一个链式存储的二叉树,采用非递归的形式,按照前、中、后序的顺序遍历二叉树。

代码

/**
* 二叉树的前、中、后序的非递归遍历
**/#include <iostream>
using namespace std;
typedef char Element;
#define MAX 100
//定义二叉树
typedef struct TNode{Element data;struct TNode *lchild,*rchild;
}TNode,*BiTree;//定义栈
typedef struct Stack{TNode *data[MAX];int top;
}Stack;//创建二叉树,采用递归的方式
void createBiTree(BiTree &T){Element e;cin>>e;if(e=='#')T=NULL;else{T=(TNode *)malloc(sizeof(TNode));T->data=e;createBiTree(T->lchild);createBiTree(T->rchild);}
}
//输出二叉树
void dispBiTree(BiTree T){if(T!=NULL){cout<<T->data<<" ";dispBiTree(T->lchild);dispBiTree(T->rchild);}
}//初始化栈
void initStack(Stack &S){S.top=-1;
}
//判栈空
bool isEmpty(Stack S){if(S.top==-1)return true;elsereturn false;
}
//进栈
bool push(Stack &S,TNode *e){if(S.top==MAX-1)return false;else{S.data[++S.top]=e;return true;}
}
//出栈
bool pop(Stack &S,TNode *&x){if(S.top==-1)return false;else{x=S.data[S.top--];return true;}
}
/**
* 二叉树的先序遍历的非递归
**/
void preOrder(BiTree T){if(T==NULL)return;Stack S;TNode *t;initStack(S);push(S,T);while(!isEmpty(S)){pop(S,t);cout<<t->data<<" ";  if(t->rchild)    //因为栈是先进后出,所以应该先入栈右子树,再入左子树push(S,t->rchild);if(t->lchild)push(S,t->lchild);}
}/**
* 二叉树的中序非递归遍历
**/
void inOrder(BiTree T){if(T==NULL)return;Stack S;TNode *p=T;initStack(S);while(!isEmpty(S) || p!=NULL){//将所有左子树进栈while(p){push(S,p);p=p->lchild;}//找到最左边的结点之后,先输出该结点pop(S,p);cout<<p->data<<" ";//然后找结点右子树(如果有的话)的最左边的结点p=p->rchild;}
}/**
* 二叉树的后序非递归遍历
* 后序遍历可以按照前序的非递归的方式,按照根、右、左的方式前序遍历,然后再颠倒一下就可以了
**/
void postOrder(BiTree T){if(T==NULL)return;Stack S,result;initStack(S);   //工作栈initStack(result);  //存放结果的栈push(S,T);TNode *t;while(!isEmpty(S)){pop(S,t);push(result,t);if(t->lchild)push(S,t->lchild);if(t->rchild)push(S,t->rchild);}while(!isEmpty(result)){pop(result,t);cout<<t->data<<" ";}
}int main() {BiTree T;createBiTree(T);dispBiTree(T);cout<<endl<<"前序非递归遍历:"<<endl;preOrder(T);cout<<endl<<"中序非递归遍历:"<<endl;inOrder(T);cout<<endl<<"后序非递归遍历:"<<endl;postOrder(T);return 0;
}

运行效果

二叉树的前、中、后的非递归遍历相关推荐

  1. 数据结构之二叉树的前中后序遍历以及层序遍历

    学习目标:读完这篇博客搞定二叉树的前中后序以及层序遍历 首先:你应该明白什么是二叉树,下面这幅图就是一个完全二叉树 其实所谓的二叉树就是一个节点有小于等于二个分支的树,可以没有分支,可以有1条分支,可 ...

  2. 转载:二叉树的前中后和层序遍历详细图解(递归和非递归写法)

    二叉树的前中后和层序遍历详细图解(递归和非递归写法) Monster_ii 2018-08-27 17:01:53 50530 收藏 403 分类专栏: 数据结构拾遗 文章标签: 二叉树 前序 中序 ...

  3. 二叉树的前序,中序,后续(非递归版本)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.前序 二.后序 三.中序 总结 前言 二叉树的非递归版本的前序中序后序在面试中也经常考,必须熟练掌握! 下面将会讲 ...

  4. 二叉树的前,中,后序遍历(思路分析) [Java][数据结构]

    二叉树的前,中,后序遍历(思路分析) 前序遍历: 先输出父节点, 再遍历左子树和右子树 中序遍历: 先遍历左子树, 再输出父节点,再遍历右子树 后序遍历: 先遍历左子树,再遍历右子树,最后输出父节点 ...

  5. 深入理解二叉树的前中后序

    一.问题 二叉树的前中后序遍历到底是什么,仅仅是三个顺序不同的 List 吗?为什么多叉树没有中序遍历? 二.遍历框架 所谓二叉树遍历是按某种特定规则,依次对二叉树中的节点进行相应的操作,并且每个节点 ...

  6. 二叉树 迭代 前 中 后_如何在Ruby中使用数组迭代计算二叉树的高度

    二叉树 迭代 前 中 后 Data structures and algorithms are the heart and soul of computer science and software. ...

  7. 二叉树的后序非递归遍历(巧妙思想)

    大家都知道二叉树的前序非递归遍历非常好写: //二叉树的结构 public class TreeNode {TreeNode left;TreeNode right;int val;TreeNode( ...

  8. Java二叉树的前中后序遍历

    Java二叉树的前中后序遍历 1.前序遍历 1.1前序遍历概念 1.2前序遍历习题 2.中序遍历 2.1中序遍历概念 2.2中序遍历习题 3.后续遍历 3.1后序遍历概念 3.2后序遍历习题 大家好, ...

  9. 后序非递归遍历二叉树

    后序遍历的顺序是左.右.根.而前序遍历的顺序是根.左.右.所以只需将前序遍历稍作改变,变成先遍历根再遍历右最后遍历左即(根右左)就会发现此时的顺序便是后序遍历的倒序了,所以这时候只需将改变后的前序遍历 ...

最新文章

  1. 基于WinCE的I2C驱动程序设计
  2. js中的true,false盲点
  3. 连接API:如何将iOS和JSON框架集成
  4. 算术表达式字符串求值
  5. asp.net ajax1.0基础回顾(六):调用ASPX页面方法
  6. python金融数据怎么获取_class类怎样在python中获取金融数据?
  7. WIN7常用的15个快捷键组合
  8. BST-V51开发板用c语言,小代码 向原文学习 BST 简单的C语言版本
  9. 今日恐慌与贪婪指数为31 恐慌程度有所上升
  10. Vivado exception_access_violation
  11. OSI七层参考模型、TCP/IP参考模型、数据封装与解封装、TCP三次握手四次挥手及面试题
  12. python3爬取网易云歌单数据清洗_网易云音乐古风歌词统计分析
  13. 基于微信小程序的超市购物系统
  14. python模拟实现打印输出进销管理系统中的每月销售明细
  15. 真的是没有底线了,重新认识Java
  16. 问题解决:java.lang.IllegalArgumentException: character to be escaped is missing
  17. R语言使用as.vector函数将矩阵数据转化为向量数据(matrix to vector)
  18. ibm电脑服务器郑州维修,郑州IBM ThinkPad笔记本芯片级维修中心
  19. 在线教育:直播授课在这三个阶段有哪些要看的?
  20. phpstudy启动MySQL服务遇到的问题及解决过程

热门文章

  1. 办公室人员老是坐着怎么办??
  2. 智慧校园源码:带部署文档和接口文档+智慧校园小程序源码
  3. 注册成功后无法登录问题
  4. Android单元测试(七):MVP与单元测试
  5. 通过挂载的方式,解决由于权限无法将rootfs直接拷贝到SD卡的EXT4分区的问题
  6. C++实例(八)菜单
  7. 身份证15转18 API数据接口
  8. 正确认识宽带路由器的主要参数
  9. java定时发送短信_java实现指定时间触发一个事件(比如定时发送短信) | 学步园...
  10. 大话卫星导航中的信号处理系列文章——北斗导航系统发展的介绍