根据后序和中序遍历输出先序遍历

根据后序和中序遍历输出先序遍历

后序遍历+中序遍历---->>>>先序遍历
输入

7
2 3 1 5 7 6 4
1 2 3 4 5 6 7

输出

Preorder: 4 1 3 2 6 5 7

思路:*找规律,
由后序为主体,每一个入树的都是后序的,从后序结果最后一个开始入树,一个一个往前。
找到一个后序的就去中序结果中找这一个后序数字所在位置,分出左右,再入树,继续找…
代码如下

#include 
#include 

typedef int ElementType;
typedef struct TNode* BinTree;
struct TNode
{
    ElementType Data;
    BinTree Left;
    BinTree Right;
};
BinTree CreatBintree(int n,int Late[],int Mid[])
{

    if(n<=0)
        return 0;
    else
    {
        BinTree Root=(BinTree)malloc(sizeof(struct TNode));
        Root->Data=Late[n-1];
        Root->Left=NULL;
        Root->Right=NULL;
        int i;
        for( i=0;i<n;i++)
        {
            if(Mid[i]==Late[n-1])
            break;
        }
        Root->Left=CreatBintree(i,Late,Mid);
        Root->Right=CreatBintree(n-i-1,Late+i,Mid+i+1);
        return Root;
    }

}
void PreorderTraversal(BinTree BT)
{
    if(BT==NULL)
        return;
    else
    {
        printf(" %d",BT->Data);
        PreorderTraversal(BT->Left);
        PreorderTraversal(BT->Right);
        return ;
    }
}
int main()
{
    int n;
    scanf("%d",&n);
    int Late[n],Mid[n];
    for(int i=0;i<n;i++)
    {
        scanf("%d",&Late[i]);
    }
    for(int i=0;i<n;i++)
    {
        scanf("%d",&Mid[i]);
    }
    BinTree BT;
    BT=CreatBintree(n, Late, Mid);
    printf("Preorder:");
    PreorderTraversal(BT);
}

今天又做了一道差不多的题,又想了想,不需要建树,想太多落入下乘了,题目只需要输出,去掉与树有关的
注意:我将int型换成char型了
代码:

#include 
#include 
int n;
void CreatTree(int n,char after[],char mid[])
{
    if(n<0)
        return ;
    else
    {
        printf("%c",after[n]);
        int i;
        for(i=0;i<=n;i++)
        {
            if(mid[i]==after[n])
                break;
        }
        CreatTree(i-1,after,mid);
        CreatTree(n-i-1,after+i,mid+i+1);
        return ;
    }
}
int main()
{
    char after[1000];
    char mid[1000];
    scanf("%d",&n);
    scanf("%s",after);
    scanf("%s",mid);
    CreatTree(n-1,after,mid);
    return 0;
}

你可能感兴趣的:(树结构)