根据后序和中序遍历输出先序遍历 (15 分)

本题要求根据给定的一棵二叉树的后序遍历和中序遍历结果,输出该树的先序遍历结果。

输入格式:

第一行给出正整数N(≤30),是树中结点的个数。随后两行,每行给出N个整数,分别对应后序遍历和中序遍历结果,数字间以空格分隔。题目保证输入正确对应一棵二叉树。

输出格式:

在一行中输出Preorder: 以及该树的先序遍历结果。数字间有1个空格,行末不得有多余空格。

输入样例:

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

输出样例:

Preorder: 4 1 3 2 6 5 7
#include <stdio.h>
#include <stdlib.h>

typedef struct Node *List;
struct Node{
    int Data;
    List L;
    List R;
};
List huanyuan(int a[],int i,int j,int b[],int k,int h)
{
    if(i>j||k>h)
        return NULL;
    List L=(List)malloc(sizeof(struct Node));
    L->Data=a[j];
    int m = k;
    while(b[m]!=a[j])
        m++;
    if(m==k)
        L->L=NULL;
    else
        L->L=huanyuan(a,i,i+m-k-1,b,k,m-1);
    if(m==h)
        L->R=NULL;
    else
        L->R=huanyuan(a,i+m-k,j-1,b,m+1,h);
    return L;
}
void xianxv(List L)
{
    if(L==NULL)
        return ;
    printf(" %d",L->Data);
    xianxv(L->L);
    xianxv(L->R);
}
int main()
{
    int n,i;
    scanf("%d",&n);
    int a[35],b[35];
    for(i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
    for(i=0;i<n;i++)
    {
        scanf("%d",&b[i]);
    }
    List L=huanyuan(a,0,n-1,b,0,n-1);
    printf("Preorder:");
    xianxv(L);
    return 0;
}

### 回答1: 这段文字是一个字节字符串,需要使用正确的编码才能正常显示。根据编码来确定,可能需要将其转换成Unicode字符串或其他编码格式,然后再进行处理。这段文字可能是关于程序运行历史的一些数据,包括先前的顺序和中序遍历输出。 ### 回答2: 根据后序遍历和中序遍历输出先序遍历需要进行如下步骤: 1. 后序遍历的最后一个元素一定是树的根节点。根据这个特性,我们可以确定根节点。 2. 在中序遍历中找到根节点的位置,根据根节点的位置,将中序遍历的序列为左子树和右子树的中序遍历序列。 3. 根据左子树和右子树的中序遍历序列的长度,从后序遍历序列中切出左子树和右子树的后序遍历序列。 4. 对于左子树和右子树的后序遍历序列,重复前面的步骤。 5. 递归地处理每个子树,直到所有子树的先序遍历序列都被得到。 下面以一个具体的例子来说明: 后序遍历序列:DEBHFCA 中序遍历序列:DBHEFCA 1. 根据后序遍历序列,最后一个元素A为根节点。 2. 在中序遍历序列中,找到根节点A的位置,将中序遍历序列为左子树和右子树的中序遍历序列。左子树的中序遍历序列为DBHE,右子树的中序遍历序列为FCA。 3. 根据左子树和右子树的中序遍历序列的长度,从后序遍历序列中切出左子树和右子树的后序遍历序列。左子树的后序遍历序列为DEBH,右子树的后序遍历序列为FCA。 4. 对于左子树和右子树的后序遍历序列,重复前面的步骤。左子树的先序遍历序列为HDEB,右子树的先序遍历序列为CAF。 5. 递归地处理每个子树,直到所有子树的先序遍历序列都被得到。最后的先序遍历序列为AHDEBCAF。 以上就是根据后序遍历和中序遍历输出先序遍历的过程。 ### 回答3: 根据后序遍历和中序遍历输出先序遍历的方法如下: 1. 首先,在后序遍历序列中找到根节点。 2. 根据中序遍历的性质,根节点的左子树在中序遍历序列中位于根节点左侧,右子树在根节点右侧。 3. 根据上一步的信息,在后序遍历序列中找到左子树和右子树的界点,即左子树的最后一个节点。 4. 根据界点,将后序遍历序列成左子树和右子树的部。 5. 重复上述步骤,别对左子树和右子树进行操作,直到遍历完整个序列为止。 6. 输出先序遍历序列。 例如,给定后序遍历序列为:4 8 7 5 15 13 12 10 给定中序遍历序列为:4 5 7 8 10 12 13 15 根据上述方法: 1. 后序遍历序列的最后一个节点10即为根节点。 2. 在中序遍历序列中,根节点左侧的为左子树序列,右侧的为右子树序列。 3. 根据上述信息,在后序遍历序列中找到左子树和右子树的界点:8。 4. 将后序遍历序列成左子树和右子树的部:4 8 7 5和10 13 12 15。 5. 对左子树和右子树别进行操作,重复上述步骤。 6. 左子树的根节点为7,在中序遍历序列中找到界点:5。成左子树和右子树:4和8。 7. 对左子树序列进行操作,左子树为空,输出4。 8. 对右子树序列进行操作,右子树的根节点为13,在中序遍历序列中找到界点:12。成左子树和右子树:10和15。 9. 对左子树序列进行操作,左子树为空,输出10。 10. 对右子树序列进行操作,右子树的根节点为15,在中序遍历序列中找到界点:12。成左子树和右子树:13。 11. 对左子树序列进行操作,左子树的根节点为12,输出12。 12. 对右子树序列进行操作,右子树序列为空,输出13。 13. 输出先序遍历序列为:10 4 8 7 5 15 12 13。 经过以上步骤,我们可以得到根据后序遍历和中序遍历输出先序遍历序列为:10 4 8 7 5 15 12 13。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值