二叉树创建以及遍历

char *ps = “ABCDEFGH”;
char *is = “CBEDFAGH”;
char *ls = “CEFDBHGA”;

BtNode * Buynode()
{
    BtNode *s = (BtNode*)malloc(sizeof(BtNode));
    if(s == NULL) exit(1);
    memset(s,0,sizeof(BtNode));
    return s;
}
void Freenode(BtNode *p)
{
    free(p);
}
BtNode * CreateTree1()    //创建二叉树(输入)
{
    BtNode *s = NULL;
    ElemType item;
    scanf("%c",&item);
    if(item != '#')
    {
        s = Buynode();
        s->data = item;
        s->leftchild = CreateTree1();
        s->rightchild = CreateTree1();
    }
    return s;
}

BtNode * CreateTree2(char *&str)  // 创建二叉树(给定字符串)
{
    BtNode *s = NULL;
    if(str!= NULL && *str!='#')
    {
        s = Buynode();
        s->data = *str;
        s->leftchild = CreateTree2(++str);
        s->rightchild = CreateTree2(++str);
    }
    return s;
}

BtNode *CreateTree3(char ** const str)
{
    BtNode *s=NULL;
    if(*str!=NULL && **str!='#'&& str!=NULL)
    {
        s=Buynode();
        s->data=**str;
        s->leftchild=CreateTree3(&++*str);
        s->rightchild=CreateTree3(&++*str);
    }
    return s;
}
// 前序中序建立二叉树

int FindIs(char *is,int n,char x)
{
    for(int i=0;i<n;i++)
    {
        if(is[i]==x)
        {
            return i;
        }
    }
}
BtNode * Create1(char *ps,char *is,int n)
{
        BtNode *s=NULL;
        if(n>0)
        {
            s=Buynode();
            s->data=ps[0];
            int pos=FindIs(is,n,ps[0]);
            if(pos==-1)exit(1);
            s->leftchild =Create1(ps+1,is,pos);
            s->rightchild =Create1(ps+pos+1,is+pos+1,n-pos-1);
        }
        return s;
}
BtNode * CreatePI(char *ps,char *is,int n)
{
    if(ps==NULL || is==NULL || n<1)
    {
        return NULL;
    }
    else
    {
    return Create1(ps,is,n);
    }

}


//中序后序建立二叉树

int FindIs2(char *is,int n,char x)
{
    for(int i=0;i<n;i++)
    {
        if(is[i]==x)
        {
            return i;
        }
    }
}

BtNode * Create2(char *is,char *ls,int n)
{
    BtNode *s=NULL;
    if(n>0)
    {
        int pos=FindIs2(is,n,ls[n-1]);
        if(pos=-1) exit(1);
        s=Buynode();
        s->data=ls[n-1];
        s->leftchild =Create2(is,ls,pos);
        s->rightchild =Create2(is+pos+1,ls+pos,n-pos-1);

    }
    return s;
}

BtNode * CreateIL(char *is,char *ls,int n)
{
    if(is==NULL ||  ls==NULL || n<1)
    {
        return NULL;
    }
    else
    {
        return Create2(is,ls,n);
    }

}


void PreOrder(BtNode *ptr)    //递归前序遍历二叉树
{
    if(ptr!= NULL)
    {
        printf("%c ",ptr->data);
        PreOrder(ptr->leftchild);
        PreOrder(ptr->rightchild);
    }
}

void InOrder(BtNode *ptr)    //中序遍历二叉树
{
    if(ptr != NULL)
    {
        InOrder(ptr->leftchild);
        printf("%c ",ptr->data);
        InOrder(ptr->rightchild);
    }
}
void PastOrder(BtNode *ptr)   //后序遍历二叉树
{
    if(ptr != NULL)
    {
        PastOrder(ptr->leftchild);
        PastOrder(ptr->rightchild); 
        printf("%c ",ptr->data);
    }
}

void NicePerOrder(BtNode *ptr)   //非递归前序遍历(栈实现)
{
    if(ptr==NULL)
    {
        return ;
    }

    stack st;
    init_stack(&st);
    push(&st,ptr);

    while(!is_empty(&st))      //栈非空时
    {
        ptr=top(&st);
        pop(&st);
        printf("%c ",ptr->data);

        if(ptr->rightchild!=NULL)
        {
            push(&st,ptr->rightchild );
        } 
        if(ptr->leftchild!=NULL)
        {
            push(&st,ptr->leftchild) ;
        }
    }
}





void NiceInOrder(BtNode *ptr)  //非递归中序遍历
{
    if(ptr==NULL)
    {
        return ;
    }
    stack st;   // BtNode *;
    init_stack(&st);

while(ptr!=NULL ||! is_empty(&st))
{
    while(ptr!=NULL)
    {
        push(&st,ptr);
        ptr=ptr->leftchild;
    }
}
    ptr=top(&st);
    pop(&st);
    printf("%c",ptr->data);
    ptr=ptr->rightchild;
}





void NicePastOrder(BtNode *ptr)  //非递归后序遍历
{
    if(ptr==NULL)
    {
        return ;
    }
    stack st; 
    init_stack(&st);
    BtNode *tag=NULL;

    while(ptr!=NULL ||! is_empty(&st))
    {
        while(ptr!=NULL)
        {
            push(&st,ptr);
            ptr=ptr->leftchild;
        }

        ptr=top(&st);
        pop(&st);
        if(ptr->rightchild ==NULL || ptr->rightchild ==tag)
        {
            printf("%c ",ptr->data);
            tag=ptr;
            ptr=NULL;    //保证继续出栈;而不是将ptr push到栈里;
        }
        else
        {
            push(&st,ptr);
            ptr=ptr->rightchild ;

        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值