//二叉树的基本操作

#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;
    
      
   
 

}

 

posted on 2013-02-25 19:39  叶城宇  阅读(177)  评论(0编辑  收藏  举报