建立二叉链表存储结构,创建二叉树。利用栈实现非递归中序遍历。
输入序列为:1 2 0 4 0 0 3 5 0 0 0
#include<stdio.h> #include<iostream> #include<malloc.h> #define TRUE 1 #define FALSE 0 #define ok 1 #define maxsize 100 using namespace std; typedef struct binode { int data; struct binode *lchild,*rchild; }binode,*bitree; typedef struct { binode *a[maxsize]; int top; }sqstack; int treecreated=FALSE; int creatbitree(bitree *T); void nrinordertraverse(bitree T); void push(sqstack *s,binode *x); binode *pop(sqstack *s); void main() { int choice=0,flag; int leave=FALSE; binode * BT; cout<<"========利用栈实现非递归遍历演示程序=========="<<endl; do { cout<<"1.创建一个二叉树,按先序遍历结果输入,空用0表示"<<endl; cout<<"2.中序遍历二叉树,非递归方式遍历二叉树"<<endl; cout<<"0.quit"<<endl; cout<<"-----input your selection:"; cin>>choice; switch(choice) { case 1: if(treecreated) { cout<<"sorry,the tree has been already created!"<<endl; break; } cout<<"please put in number!"<<endl; flag=creatbitree(&BT); if(flag==ok) { cout<<"okey,now a tree named BT is created.."<<endl; treecreated=TRUE; } case 2: cout<<"in nrorder:"; nrinordertraverse(BT); cout<<endl; break; case 0: leave=TRUE; break; } }while(!leave); cout<<"thanks for using ,bye~"<<endl; } int creatbitree(bitree *T) { int ch=0; cin>>ch; if(ch==0) (*T)=NULL; else { (*T)=(bitree)malloc(sizeof(binode)); (*T)->data=ch; creatbitree(&(*T)->lchild); creatbitree(&(*T)->rchild); } return ok; } void nrinordertraverse(bitree T) { sqstack s; binode *p; s.top=0; push(&s,T); while(s.top!=0) { while(s.a[s.top]!=NULL) { p=s.a[s.top]; push(&s,p->lchild); } p=pop(&s); if(s.top!=0) { p=pop(&s); cout<<p->data<<" "; push(&s,p->rchild); } } cout<<endl; } void push(sqstack *s,binode *x) { if(s->top==maxsize) cout<<"stack overflow!"<<endl; else { s->top++; s->a[s->top]=x; } } binode *pop(sqstack *s) { binode *x; if(s->top==0) { cout<<"stack underflow"<<endl; return(NULL); } else { x=s->a[s->top]; s->top--; return(x); } }