建立二叉树的二叉链表(已知先序和中序,求后序)

建立二叉树的二叉链表(已知先序和中序,求后序)



#include <stdio.h>
#include <stdlib.h>
#include <string.h>    //原理:由前序和中序可以确定唯一的二叉树
typedef struct Node
{
    char Data;
    struct Node* LChild;
    struct Node* RChild;          //先序遍历创建
}BiTNode,*PBiTNode;
char pre[200],in[200];
PBiTNode CreatepostBiTree(int pre_start,int pre_end,int in_start,int in_end)
{
    int i,LTreeLen,RTreeLen;
    PBiTNode T;
    T=(PBiTNode)malloc(sizeof(BiTNode));  //建立根节点
    T->Data=pre[pre_start];               //遍历前序储存的结点,因为是先序,所以树第一个是数一定是A,
    T->LChild=T->RChild=NULL;             //置空的方法。
    i=in_start;
    while(in[i]!=T->Data)
    i++;
    LTreeLen=i-in_start;                  //左子树长度 ,这自己画下图就可以知道。
    RTreeLen=in_end-i;                    //右子树长度
    if(LTreeLen)                          //LTreeLen长度为0就结束。
    T->LChild=CreatepostBiTree(pre_start+1,pre_start+LTreeLen,in_start,i-1); //啊,这个规律记住就行。
    if(RTreeLen)
    T->RChild=CreatepostBiTree(pre_start+LTreeLen+1,pre_end,i+1,in_end);
    return T;                           //一个对一个就直接return;
}
PBiTNode temp()
{
    PBiTNode T;
    int Len_pre,Len_in;
    Len_pre=strlen(pre);
    Len_in=strlen(in);
    T=CreatepostBiTree(0,Len_pre-1,0,Len_in-1);
    return T;
}
void print(PBiTNode bt)
{
    if(bt!=NULL)
    {
        print(bt->LChild);
        print(bt->RChild);
        printf("%c",bt->Data);
    }
}
int main()
{
    PBiTNode bt;
    scanf("%s",pre);
    getchar();
    scanf("%s",in);
    bt=temp();
    print(bt);
    printf("\n");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/xigongdali/article/details/80247139