//二叉树的基本操作
#include<iostream>
using namespace std;
typedef char Telemtype;
typedef struct bitnode {
Telemtype date;
int mark;
bitnode *lchild,*rchild;
}*bitree;
int initbitree(bitree &T)
{ T=NULL;
return 1;
}
int createbitree (bitree &T){
//按先序次序输入二叉树中节点的值(一个字符),空格字符表示空树;
//构造二叉树表表示的二叉树T.
char ch;
cin>>ch;
if(ch=='0')T=NULL;
else{
if( !(T= (bitnode*)malloc(sizeof(bitnode)) ) )return 0;
T->date=ch;
createbitree ( T->lchild );
createbitree ( T->rchild );
}
return 1;
}//creatbitree
typedef struct s{
bitnode elem ;
s* next;
}s;
//链表栈的结点类型为结构体;
void initstack(s*&base)
{ base=(s*) malloc (sizeof(s));
base->next=NULL;
}
void push(s*&base , bitree &e)
{ s* t=(s*) malloc (sizeof(s));
t->elem.date=e->date;
t->elem.lchild=e->lchild;
t->elem.mark=e->mark;
t->elem.rchild=e->rchild;
t->next =base->next ;
base->next=t;
//cout<<"!!!!!"<<t->elem.date<<endl;
}
bool stackempty(s*&base)
{
if(base->next==NULL)
return true;
else return false;
}
bool pop(s *&base,bitree &e)
{ s* t= (s*) malloc (sizeof(s));
if( stackempty(base))return false;
else
{ t=base->next ;
e->date =t->elem.date;
e->lchild=t->elem.lchild;
e->mark=t->elem.mark;
e->rchild=t->elem.rchild;
base->next=t->next;
free(t); //cout<<"e->mark="<<e->mark<<e->date <<endl;
}
return true;
}
bool getstack(s*&base, bitree e)
{
s* p=base ; bitnode t;
while(p->next )
{ p=p->next ;
t=p->elem ;
if(t.date ==e->date )
return true;}
return false;
}
#include "stdafx.h"
#include"二叉树的基本操作.h"
bool visit(Telemtype e)
{ //cout<<"999999"<<endl;
if(e){ cout<<e;return true;}
return false;
}
bool preordertraverse(bitnode T )
{ s* base=new s;
bitree p=new bitnode;
*p=T;initstack(base);
if(p)push(base,p);
while(p){
if(!pop(base,p)) break;
if(!visit(p->date)) return false;
if(p->rchild) push(base,p->rchild);
if(p->lchild) push(base,p->lchild);
}
return true;
}
int preordertravese2(bitree &T )
{
if(T)
{
if(!visit(T->date)){cout<<"`````````~~~~~~~"<<endl; return 0;}
if( preordertravese2(T->lchild) )
{if( preordertravese2(T->rchild) )
return 1;}
return 0;
}
else return 1;
}
int inordertraverse(bitnode T )
{
s*base=new s;
bitree p=new bitnode;
*p=T;
initstack(base);
while( (!stackempty(base) )|| p )
{
if(p){ push(base,p );p=p->lchild;}
else {
p=new bitnode;
pop(base,p);
if(!visit(p->date)) return 0;
p=p->rchild ;
}//else;
}//while
return 1;
}//inordertraverse;
int inordertraverse2(bitree T )
{
if(T){
if(!inordertraverse2(T->lchild ))
return 0;
if(!visit(T->date)) return 0;
if(!inordertraverse2(T->rchild ))
return 0;
}
return 1;
}
int postordertraverse(bitree T )
{
s*base=new s;int n=0;
bitree p=T;initstack(base);
while(1)
{
while(p)
{
p->mark=1;
push(base,p);
p=p->lchild;
}
do{ p=new bitnode;
if(!pop(base,p))break;
if(p->mark==1)
{p->mark=2;push(base,p);p=p->rchild ;}
else if(p->mark ==2)
{
if(!visit(p->date)) return 0;
}
}while(1);
}//while
return 1;
}//postordertraverse
int postordertraverse2(bitree T )
{
if(T){
if(! postordertraverse2(T->lchild ))
return 0;
if(! postordertraverse2(T->rchild ))
return 0;
if(!visit(T->date)) return 0;
}
return 1;
}//postordertraverse2
void fun()
{
bitree T;
initbitree(T);
createbitree (T);
preordertraverse(*T);cout<<"非递归先序遍历"<<endl;
preordertravese2(T);cout<<"递归先序遍历"<<endl;
inordertraverse(*T);cout<<"非递归中序遍历"<<endl;
inordertraverse2(T);cout<<"递归中序遍历"<<endl;
postordertraverse2(T);cout<<"递归后续遍历"<<endl;
cout<<"T->date ="<<T->date<<endl;
// postordertraverse(T);cout<<"非递归后续遍历"<<endl;
}