玩转二叉树
2017-03-05 22:19
169 查看
9 玩转二叉树 (25分)
给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列。所谓镜面反转,是指将所有非叶结点的左右孩子对换。这里假设键值都是互不相等的正整数。
输入格式:
输入第一行给出一个正整数N(\le≤30),是二叉树中结点的个数。第二行给出其中序遍历序列。第三行给出其前序遍历序列。数字间以空格分隔。
输出格式:
在一行中输出该树反转后的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。
输入样例:
7
1 2 3 4 5 6 7
4 1 3 2 6 5 7
输出样例:
4 6 1 7 5 3 2
Think:看到要把左右孩子交换的时候就感觉这个题很麻烦,但是有一想,之前都是先遍历左孩子在遍历右孩子,那么现在先遍历右孩子,再遍历左孩子不就行了
给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列。所谓镜面反转,是指将所有非叶结点的左右孩子对换。这里假设键值都是互不相等的正整数。
输入格式:
输入第一行给出一个正整数N(\le≤30),是二叉树中结点的个数。第二行给出其中序遍历序列。第三行给出其前序遍历序列。数字间以空格分隔。
输出格式:
在一行中输出该树反转后的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。
输入样例:
7
1 2 3 4 5 6 7
4 1 3 2 6 5 7
输出样例:
4 6 1 7 5 3 2
Think:看到要把左右孩子交换的时候就感觉这个题很麻烦,但是有一想,之前都是先遍历左孩子在遍历右孩子,那么现在先遍历右孩子,再遍历左孩子不就行了
#include <stdio.h> #include <string.h> #include <stdlib.h> struct node{ int data; struct node*l,*r; }; struct node*creat(int *a,int *b,int n){ struct node *xulie; if (n<=0){ return NULL; } xulie=(struct node*)malloc(sizeof(struct node)); xulie->data=a[0]; int q; for (q=0;q<n;q++){ if (b[q]==a[0]){ break; } } xulie->l=creat(a+1,b,q); xulie->r=creat(a+q+1,b+q+1,n-q-1); return xulie; } int flag=1; void cengxu(struct node*p){ int in=0,out=0; struct node*a[1050]; a[in++]=p; while(in>out){ if (a[out]!=NULL){ if (flag){ printf("%d",a[out]->data); flag=0; } else{ printf(" %d",a[out]->data); } a[in++]=a[out]->r; a[in++]=a[out]->l; } out++; } } int main(){ int n; scanf("%d",&n); int a[110],b[110]; struct node*xulie; xulie=(struct node*)malloc(sizeof(struct node)); for (int i=0;i<n;i++){ scanf("%d",&b[i]); } for (int i=0;i<n;i++){ scanf("%d",&a[i]); } xulie=creat(a,b,n); cengxu(xulie); printf("\n"); return 0; }
相关文章推荐
- L2-011. 玩转二叉树
- L2-011. 玩转二叉树
- L2-011. 玩转二叉树
- PTA-玩转二叉树
- L2-011. 玩转二叉树-PAT团体程序设计天梯赛GPLT
- CCCC团体天梯赛-树的遍历 + 玩转二叉树
- L2-011. 玩转二叉树-PAT团体程序设计天梯赛GPLT
- CCCC练习 5-11玩转二叉树
- L2-011. 玩转二叉树
- L2-011. 玩转二叉树
- 【PTA 5-11 玩转二叉树 (25分)】+ 二叉树
- L2-011. 玩转二叉树
- L2-011. 玩转二叉树
- L2-011. 玩转二叉树
- L2-011. 玩转二叉树
- L2-011. 玩转二叉树
- PAT L2-011. 玩转二叉树
- L2-011. 玩转二叉树
- L2-011. 玩转二叉树
- L2-011. 玩转二叉树