二叉树-非递归遍历(先、中、后)
2015-10-12 20:44
260 查看
#include<iostream> #include<malloc.h> #include<stdio.h> #define MAXSIZE 20 //最多结点个数 using namespace std; /*二叉链表*/ typedef struct bnode{ char data; struct bnode *lchild,*rchild; }Bnode,* BTree; /*顺序栈*/ typedef BTree DataType; typedef struct{ DataType data[MAXSIZE]; int top; }SeqStack,* PSeqStack; PSeqStack Init_SeqStack(void); //建空栈 void Push_SeqStack(PSeqStack S,DataType x); //入栈 int Empty_SeqStack(PSeqStack S); //判断栈是否为空 void Pop_SeqStack(PSeqStack S,DataType * y);//出栈 void Destroy_SeqStack(PSeqStack * S); //销毁栈 BTree CreateBinTree(void); //先序创建二叉树 void NRPreOrder(BTree t); //非递归先序遍历 void NRInOrder(BTree t); //非递归中序遍历 void NRPostOrder(BTree t); //非递归后序遍历 /*主函数*/ int main(){ cout<<"\n请按先序次序输入各结点的值,以#表示空树(输入时可连续输入):\n"; BTree T=CreateBinTree(); if(!T){ cout<<"\n未建立树,请先建树!"; return 0; } cout<<"\n\n非递归先序遍历:"; NRPreOrder(T); cout<<"\n非递归中序遍历:"; NRInOrder(T); cout<<"\n非递归后序遍历:"; NRPostOrder(T); return 1; } /******************************顺序栈的一些基本操作******************************/ /*建空栈*/ PSeqStack Init_SeqStack(void){ PSeqStack S; S=(PSeqStack)malloc(sizeof(SeqStack)); if(S){ S->top = -1;//表示空栈 } return S; } /*入栈*/ void Push_SeqStack(PSeqStack S,DataType x){ if(S->top == MAXSIZE-1){ cout<<"栈满不能入栈!"; }else{ S->top++; S->data[S->top]=x; } } /*判断栈是否为空*/ int Empty_SeqStack(PSeqStack S){ if(S->top == -1) return 1; else return 0; } /*出栈*/ void Pop_SeqStack(PSeqStack S,DataType * y){ if(Empty_SeqStack(S)){ cout<<"栈空不能出栈!"; }else{ * y=S->data[S->top]; S->top--; } } /*销毁栈*/ void Destroy_SeqStack(PSeqStack * S){ if(* S) free(* S); * S=NULL; } /*先序创建二叉树*/ BTree CreateBinTree(void){ BTree t; char ch=getchar(); if(ch=='#') t=NULL;//读入#时,将相应节点指针置空 else{ t=(Bnode *)malloc(sizeof(Bnode)); t->data=ch; t->lchild=CreateBinTree();//构造二叉树的左子树 t->rchild=CreateBinTree();//构造二叉树的右子树 } return t; } /******************************非递归******************************/ void NRPreOrder(BTree t){//非递归先序遍历 BTree p=t; PSeqStack S=Init_SeqStack(); while(p || !Empty_SeqStack(S)){ if(p){ cout<<p->data<<" "; Push_SeqStack(S,p); p=p->lchild; }else{ Pop_SeqStack(S,&p); p=p->rchild; } } Destroy_SeqStack(&S); } void NRInOrder(BTree t){//非递归中序遍历 BTree p=t; PSeqStack S=Init_SeqStack(); while(p || !Empty_SeqStack(S)){ if(p){ Push_SeqStack(S,p); p=p->lchild; }else{ Pop_SeqStack(S,&p); cout<<p->data<<" "; p=p->rchild; } } Destroy_SeqStack(&S); } void NRPostOrder(BTree t){//非递归后序遍历 BTree p=t; PSeqStack S1=Init_SeqStack(); PSeqStack S2=Init_SeqStack(); while(p || !Empty_SeqStack(S2)){ if(p){ Push_SeqStack(S1,p); Push_SeqStack(S2,p); p=p->rchild; }else{ Pop_SeqStack(S2,&p); p=p->lchild; } } while(!Empty_SeqStack(S1)){ Pop_SeqStack(S1,&p); cout<<p->data<<" "; } Destroy_SeqStack(&S1); Destroy_SeqStack(&S2); }
相关文章推荐
- android 代码实现控件之间的间距
- [Android]在代码里运行另一个程序的方法
- AVL树-自平衡二叉查找树(Java实现)
- 肯特·贝克:改变人生的代码整理魔法
- 网页恶意代码的预防
- 动易2006序列号破解算法公布
- 文件遍历排序函数
- 高手写的Tracer-Flash代码调试类代码下载
- CSS代码缩写技巧
- 非主流Q-zOne代码代码搜集第1/2页
- Ruby实现的矩阵连乘算法
- CreateWeb.vbs 代码
- C#插入法排序算法实例分析
- Lua 学习笔记之C API 遍历 Table实现代码
- Lua中编译执行代码相关的函数详解
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析