别试图救赎我 2023-04-15 14:33 采纳率: 100%
浏览 18
已结题

pta上为啥会显示段错误呢?

7-1 树的遍历
给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。

输入格式:
输入第一行给出一个正整数N(≤30),是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中序遍历序列。数字间以空格分隔。

输出格式:
在一行中输出该树的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。

输入样例:
7
2 3 1 5 7 6 4
1 2 3 4 5 6 7
输出样例:
4 1 6 3 5 7 2

#include<stdio.h>
#include<stdlib.h>

struct Tree
{
    int data;
    struct Tree * left;
    struct Tree * right;
};
struct Tree * build(int a[],int b[],int n);
void levelorder(struct Tree * p);

struct Tree * build(int a[],int b[],int n)
{
    if(n<=0)return NULL;
    
    struct Tree * p=(struct Tree *)malloc(sizeof(struct Tree));
    p->data=a[n-1];
    p->left=p->right=NULL;
    
    int i;
    for(i=0;i<n;i++)
    {
        if(b[i]==a[n-1]) break;
    }
    
    p->left=build(a,b,i);
    p->right=build(a+i,b+i+1,n-i-1);
    
    return p;
}

void levelorder(struct Tree * p)
{
    if(p)
    {
        struct Tree * q[100];
        struct Tree * r;
        int front=0;
        int rear=0;
    
        q[rear++]=p;
        while(front!=rear)
        {
            r=q[front++];
        
            if(r==p)printf("%d",p->data);
            else printf(" %d",p->data);
        
            if(p->left)q[rear++]=p->left;
            if(p->right)q[rear++]=p->right;
        }
    }
}

int main()
{
    int n;
    scanf("%d",&n);
    
    int a[100];
    int b[100];
    
    for(int i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
    
    for(int i=0;i<n;i++)
    {
        scanf("%d",&b[i]);
    }
    
    struct Tree * p=build(a,b,n);
    levelorder(p);
    
    return 0;
}

谢指点!

  • 写回答

3条回答 默认 最新

  • CQ.abc 2023-04-15 14:51
    关注
    #include<stdio.h>
    #include<stdlib.h>
    struct Tree
    {
        int data;
        struct Tree * left;
        struct Tree * right;
    };
    
    // 根据后序遍历和中序遍历构建二叉树
    struct Tree * build(int a[], int b[], int n)
    {
        if(n <= 0) return NULL;
        struct Tree * p = (struct Tree *)malloc(sizeof(struct Tree));
        p->data = a[n - 1];
        p->left = p->right = NULL;
        int i;
        for(i = 0; i < n; i++)
        {
            if(b[i] == a[n - 1]) break;
        }
        // 递归构建左右子树
        p->left = build(a, b, i);
        p->right = build(a + i, b + i + 1, n - i - 1);
        return p;
    }
    
    // 层序遍历二叉树
    void levelorder(struct Tree * p)
    {
        if(p)
        {
            // 使用队列实现层序遍历
            struct Tree * q[30];
            int front = 0, rear = 0;
            q[rear++] = p;
            while(front != rear)
            {
                struct Tree * r = q[front++];
                if(r->left) q[rear++] = r->left;
                if(r->right) q[rear++] = r->right;
                // 根据是否为根节点输出相应的格式
                if(front == 1) printf("%d", r->data);
                else printf(" %d", r->data);
            }
        }
    }
    
    int main()
    {
        int n;
        scanf("%d", &n);
        int a[30], b[30];
        for(int i = 0; i < n; i++)
        {
            scanf("%d", &a[i]);
        }
        for(int i = 0; i < n; i++)
        {
            scanf("%d", &b[i]);
        }
        struct Tree * p = build(a, b, n);
        levelorder(p);
        return 0;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 4月23日
  • 已采纳回答 4月15日
  • 创建了问题 4月15日

悬赏问题

  • ¥15 linux驱动,linux应用,多线程
  • ¥20 我要一个分身加定位两个功能的安卓app
  • ¥15 基于FOC驱动器,如何实现卡丁车下坡无阻力的遛坡的效果
  • ¥15 IAR程序莫名变量多重定义
  • ¥15 (标签-UDP|关键词-client)
  • ¥15 关于库卡officelite无法与虚拟机通讯的问题
  • ¥15 目标检测项目无法读取视频
  • ¥15 GEO datasets中基因芯片数据仅仅提供了normalized signal如何进行差异分析
  • ¥100 求采集电商背景音乐的方法
  • ¥15 数学建模竞赛求指导帮助