【PTA】玩转二叉树

L2-011 玩转二叉树 (25分)

给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列。所谓镜面反转,是指将所有非叶结点的左右孩子对换。这里假设键值都是互不相等的正整数。

输入格式:

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

输出格式:

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

输入样例:

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

输出样例:

4 6 1 7 5 3 2

源代码:#include <stdio.h>#include <stdlib.h>typedef struct nold{    int data;    struct nold *lchild,*rchild;} Bitnold,*Bitree;//定义结构体void creat(int prer[],int i,int j,int mid[],int k,int h,Bitnold **t)//由前序遍历序列和中序遍历序列恢复二叉树{    *t=(Bitnold*)malloc(sizeof(Bitnold));    (*t)->data=prer[i];    int m=k;    while(prer[i]!=mid[m])        m++;    if(m==k)        (*t)->lchild=NULL;    else        creat(prer,i+1,i+m-k,mid,k,m-1,&(*t)->lchild);    if(m==h)        (*t)->rchild=NULL;    else        creat(prer,i+m-k+1,j,mid,m+1,h,&(*t)->rchild);}

int main(){    int i;    Bitnold *root;    int n;    scanf("%d",&n);    int mid[n];    int prer[n];    for(i=0; i<n; i++)        scanf("%d",&mid[i]);    for(i=0; i<n; i++)        scanf("%d",&prer[i]);    creat(prer,0,n-1,mid,0,n-1,&root);    change(root);    LevelOrder(root);    return 0;}

void change(Bitnold *r) //左右子树交换{    Bitnold *temp=NULL;    if(r)    {        if(r==NULL) return;        temp = r->lchild;        r->lchild=r->rchild;        r->rchild = temp;        change(r->lchild);        change(r->rchild);    }}

void PreOrder(Bitnold *r)//前序遍历{    if(r)    {        printf("%d ",r->data);        PreOrder(r->lchild);        PreOrder(r->rchild);    }}

void LevelOrder(Bitnold *r) //层次遍历{    Bitnold *queue[100];    int front,rear,i=1,j=0;    int arr[100];    if(r==NULL) return;    front=-1;    rear=0;    queue[rear]=r;    while(front!=rear)    {        front++;        arr[j]=queue[front]->data;        j++;        if(queue[front]->lchild!=NULL)        {            rear++;            queue[rear]=queue[front]->lchild;        }        if(queue[front]->rchild!=NULL)        {            rear++;            queue[rear]=queue[front]->rchild;        }    }    printf("%d",arr[0]);    for(i=1;i<j;i++)    {        printf(" %d",arr[i]);    }    return 0;}

原文地址:https://www.cnblogs.com/Andre/p/12182277.html

时间: 2024-11-14 00:35:29

【PTA】玩转二叉树的相关文章

L2-011. 玩转二叉树

L2-011. 玩转二叉树 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列.所谓镜面反转,是指将所有非叶结点的左右孩子对换.这里假设键值都是互不相等的正整数. 输入格式: 输入第一行给出一个正整数N(<=30),是二叉树中结点的个数.第二行给出其中序遍历序列.第三行给出其前序遍历序列.数字间以空格分隔. 输出格式: 在一行中输出该树反转后的层序遍历的序列.数字间以1个空格分隔

团体程序设计天梯赛 L2-006. 树的遍历 L2-011. 玩转二叉树

L2-006. 树的遍历 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #include <stdbool.h> 5 6 struct node 7 { 8 long left,right; 9 }tree[10000]; 10 11 long a[31],b[31]; 12 13 void work(long l,long r,long p,long q,long fa

树的遍历 (和) 玩转二叉树 的总结博客

树的遍历: 关键在与如何利用中序和后序建树. 中序的作用,提供了左右子树的所有节点的分布! 前序,后序的作用:就是第一个元素(最后一个元素)提供了根节点,让中序找到子树的分布情况. #include<iostream> #include<queue> #include<vector> using namespace std; const int maxn = 100; int af[maxn], in[maxn], n; struct node{ int l, r; }

L2-011. 玩转二叉树(PAT)

很简单的一道题目,注意对二叉树的深度分析一下,把数组开大点,前序中序求这个树,我用数组静态做的,有点像是线段树的构造过程,数据也没夸张到需要动态分配内存,不过后边的反转二叉树又让我想到了那个梗,蛤蛤蛤蛤. #include <iostream> #include <cstdio> #include <cstring> #include <queue> using namespace std; const int maxn=1000000; int n,num

ACM题目————玩转二叉树

给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列.所谓镜面反转,是指将所有非叶结点的左右孩子对换.这里假设键值都是互不相等的正整数. 输入格式: 输入第一行给出一个正整数N(<=30),是二叉树中结点的个数.第二行给出其中序遍历序列.第三行给出其前序遍历序列.数字间以空格分隔. 输出格式: 在一行中输出该树反转后的层序遍历的序列.数字间以1个空格分隔,行首尾不得有多余空格. 输入样例: 7 1 2 3 4 5 6 7 4 1 3 2 6 5 7 输出样例:

天梯赛习题集 L2-011. 玩转二叉树

给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列.所谓镜面反转,是指将所有非叶结点的左右孩子对换.这里假设键值都是互不相等的正整数. 输入格式: 输入第一行给出一个正整数N(<=30),是二叉树中结点的个数.第二行给出其中序遍历序列.第三行给出其前序遍历序列.数字间以空格分隔. 输出格式: 在一行中输出该树反转后的层序遍历的序列.数字间以1个空格分隔,行首尾不得有多余空格. 输入样例: 7 1 2 3 4 5 6 7 4 1 3 2 6 5 7 输出样例:

玩转二叉树

给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列.所谓镜面反转,是指将所有非叶结点的左右孩子对换.这里假设键值都是互不相等的正整数. 输入格式: 输入第一行给出一个正整数N(<=30),是二叉树中结点的个数.第二行给出其中序遍历序列.第三行给出其前序遍历序列.数字间以空格分隔. 输出格式: 在一行中输出该树反转后的层序遍历的序列.数字间以1个空格分隔,行首尾不得有多余空格. 输入样例: 7 1 2 3 4 5 6 7 4 1 3 2 6 5 7 输出样例:

7-1 玩转二叉树

给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列.所谓镜面反转,是指将所有非叶结点的左右孩子对换.这里假设键值都是互不相等的正整数. 先是建树 快速套用模板 然后  他是按照层遍历  那就用bfs  如果按照某种序遍历  用dfs #include<bits/stdc++.h> using namespace std; int n; int zhong[35]; int qian[35]; int le[35],ri[35]; int built(int

PTA 7-23 还原二叉树

知识点: 根据前序遍历和中序遍历还原二叉树 给定一棵二叉树的先序遍历序列和中序遍历序列,要求计算该二叉树的高度. 根据二叉树的性质,如果我们只给出二叉树的一种遍历方式的结果,不能完全确定一颗二叉树,这时的二叉树可能具有多种形态.但是当我们给出一颗二叉树的两种不同遍历方式的时候,就可以完全确定一颗二叉树. 这里以前序遍历和中序遍历为例. 假如我们给出两棵二叉树的前中序遍历分别为 前序遍历:ABDFGHIEC 中序遍历:FDHGIBEAC 由前序遍历的性质,我们可以知道 A 一定是这棵树的根结点 根