Data Structure——二叉树的遍历

#include<stdio.h>
#include<iostream>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -1
using namespace std;
typedef int Status;
typedef char TElemType;
typedef struct BiNode{
TElemType data;
struct BiNode *lchild,*rchild;
}BiNode,*BiTree;
typedef struct StackNode
{    BiNode *Sdata;
int flag;
struct StackNode *next;
}StackNode,*LinkStack;
Status CreateBiTree(BiTree &T)
{    
    char ch;
    cin>>ch;
    if(ch== '#' ) T = NULL;
    else {
    T=new BiNode;
    T->data = ch;
    CreateBiTree(T->lchild);
    CreateBiTree(T->rchild);
    }
    return OK;

// CreateBiTree
void InitStack(LinkStack &S)
{
    S=NULL;
}
Status Push(LinkStack &S , BiTree q)
{    
    LinkStack p;
    p=new StackNode;
    if (!p) exit(OVERFLOW);
    p->Sdata=q;
    p->flag=0;
    p->next=S;
    S=p;
    return OK;
}
Status Pop (LinkStack &S,BiTree &q)
{    
    LinkStack p;
    if (S==NULL) return ERROR;
    q = S-> Sdata;
    p = S;
    S = S-> next;
    delete p;
    return OK;
}
LinkStack GetTop(LinkStack S)
{
    if(S==NULL) return NULL;
    else return S;
}
Status PreOrderTraverse( BiTree T)
{    
    BiTree p;
    LinkStack S;
    InitStack(S);
    p=T;
    while (p||(S!=NULL) )
{
    if(p)
    {
        cout<<p->data;
        Push(S,p);
        p=p->lchild;
    }
    else{    
        Pop(S,p);
        p=p->rchild;
        }
    }
return OK;
}
Status InOrderTraverse(BiTree T)
{    
    BiTree p;
    LinkStack S;
    InitStack(S);
    p=T;
    while(p||(S!=NULL)){
    if(p)
    {    
        Push(S,p);
        p = p->lchild;
    }
    else
    {    
        Pop(S,p);
        cout<<p->data;
        p=p->rchild;
        }
    }
    return OK;
}
Status PostOrderTraverse( BiTree T)

    LinkStack S;
    InitStack(S);
    StackNode *q;
    BiTree p; 
    p=T;
    while (p||(S!=NULL))
    {    
        if(p)
    {        
        Push(S,p);
        p=p->lchild;
    }
    else
    {    
    if(!S) 
    return 0;
    q=GetTop(S);
    if(q->Sdata->rchild==NULL||q->flag==1)
    {    
    Pop(S,p);
    cout<<p->data;
    p=NULL;
    }
    else
    {    
    q->flag=1;
    p=q->Sdata->rchild;
    }
    }    
}
return OK;
}
Status PreOrder(BiTree T){
if(T==NULL) 
    return OK;
    else{
    cout<<T->data;
    PreOrder (T->lchild);
    PreOrder (T->rchild);
    }
}
Status InOrder(BiTree T){
    if(T==NULL) 
    return OK;
    else{
    InOrder(T->lchild);
    cout<<T->data;
    InOrder(T->rchild);
    }
}
Status PostOrder(BiTree T){
    if(T==NULL) 
    return OK;
    else{
    PostOrder(T->lchild);
    PostOrder(T->rchild);
    cout<<T->data;
    }
}
int main()
{    
    BiTree T;
    int a;
    cout<<"Create a BiTree(AB##c##):";
    CreateBiTree(T);
    for(;;)
    {    
        printf("\ninput a number to choose zhe Non-recursive[1] or recursive[2]\n");
        printf("\tinput a [0] stop;\n");
        scanf("%d",&a);
    if(a==1)
    {    
        cout<<"Non-recursive traversal:";
        cout<<"\npreorder:";
        PreOrderTraverse(T);
        cout<<"\ninorder:";
        InOrderTraverse(T);
        cout<<"\npostorder:";
        PostOrderTraverse(T);
    }
    else if(a==2)
    {    
    cout<<"Recursive traversal:";
    cout<<"\npreorder:";
    PreOrder(T);
    cout<<"\ninorder:";
    InOrder(T);
    cout<<"\npostorder:";
    PostOrder(T);
    }
    else break;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值