二叉树(代码)

1. 创建二叉树

因为在含有n个结点的二叉链表中一定有n+1个空指针域,所以在输入数据时一定要给出n+1个空指针值。

首先还是先要声明一下结构体

typedef char ElemType;
typedef struct Node
{
    ElemType data;
    struct Node *lchild,*rchild;
}BitTree;       

BitTree *creBitTree(void)
{
    BitTree *bt; ElemType x;
    scanf("%c",&x);
    if(x==' ')bt=NULL;
    else
    {
        bt = (BitTree*)malloc(sizeof(BitTree));
        bt->data = x;
        bt->lchild = creBitTree();
        bt->rchild = creBitTree();
    }
    return bt;
}

2,递归遍历算法

//先序遍历
void PreOrder(BitTree *bt)
{
    if(bt!=NULL)
    {
        printf("%c",bt->data);
        PreOrder(bt->lchild);
        PreOrder(bt->rchild);
    }
}
//中序遍历
void InOrder(BitTree *bt)
{
    if(bt!=NULL)
    {
        InOrder(bt->lchild);
        printf("%c",bt->data);
        InOrder(bt->rchild);
    }
}
//后序遍历
void PostOrder(BitTree *bt)
{
    if(bt!=NULL)
    {
        PostOrder(bt->lchild);
        PostOrder(bt->rchild);
        printf("%c",bt->data);
    }
}

3,非递归遍历算法

//先序遍历
void PreOrder(BitTree *T)
{
    stack S;       //自己实现的栈,以及一些函数
    BitTree *p;
    InitStack(&S);
    push(&S,T);
    while(!EmptyStack(&S))
    {
        p = pop(&S);
        while(p)
        {
            printf("%c ",p->data);
            if(p->rchild) push(&S,p->rchild);
            p = p->lchild;
        }
    }
}

//中序遍历
void InOrder(BitTree *T)
{
    stack S;
    BitTree *p;
    InitStack(&S);
    p = T;
    while(p || !EmptyStack(&S))
    {
        while(p)
        {
            push(&S,p);
            p = p->lchild;
        }
        p = pop(&S);
        printf("%c",p->data);
        p = p->rchild;
    }
}

//后序遍历
void PostOrder(BitTree *T)
{
    stack S;
    BitTree *p,*q;
    InitStack(&S);
    p = T; q = NULL;
    while(p||!EmptyStack(&S))
    {
        if(p!=q)
        {
            while(p)
            {
                push(&S,p);
                if(p->lchild) p=p->lchild;
                else p = p->rchild;
            }
        }
        if(EmptyStack(&S))break;
        q = gettop(&S);
        if(q->rchild==p)
        {
            p=pop(&S);
            printf("%c ",p->data);
        }
        else
        p = q->rchild;
    }

}

     

猜你喜欢

转载自www.cnblogs.com/wzqstudy/p/10095433.html
今日推荐