玩转二叉树
2018-04-03 21:59
211 查看
给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列。所谓镜面反转,是指将所有非叶结点的左右孩子对换。这里假设键值都是互不相等的正整数。
输入格式:
输入第一行给出一个正整数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
//思路: //一.根据后序遍历和中序遍历建树 //1.二叉链表结构的定义 //2.先序遍历输出数据 #include<stdio.h> #include<stdlib.h> int mid[31]; int first[31]; typedef struct node { int data; struct node *left,*right; }BinTree; BinTree * Build(int n,int *mid,int *last); void cengxu(struct node*p); int main() { int N; int i; BinTree *root=NULL; scanf("%d",&N); for(i=0;i<N;i++) { scanf("%d",&mid[i]); } for(i=0;i<N;i++) { scanf("%d",&first[i]); } root=Build(N,mid,first); //printf("Preorder:"); cengxu(root); printf("\n"); return 0; } BinTree * Build(int n,int *mid,int *first) { int i; BinTree *root=NULL; if(n<=0) return NULL; root=(BinTree *) malloc(sizeof(BinTree)); root->data=*first; root->left =NULL; root->right =NULL; for(i=0;i<n;i++) { if(root->data ==mid[i]) break; } root->left=Build(i,mid,first+1); root->right=Build(n-i-1,mid+i+1,first+i+1); return root; } 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]->right ; a[in++]=a[out]->left ; } out++; } }
相关文章推荐
- 团体程序设计天梯赛-练习集 L2-011. 玩转二叉树 解题报告
- 【天梯赛】L2-011. 玩转二叉树 ( 层次遍历 )
- L2-011. 玩转二叉树
- PAT ~ L2-011. 玩转二叉树 (树的遍历互求 + 交换左右节点)
- L2-011. 玩转二叉树
- L2-011. 玩转二叉树
- L2-011. 玩转二叉树
- L2-011. 玩转二叉树 (树的层序遍历)
- PAT - 天梯赛 L2-011 玩转二叉树
- L2-011. 玩转二叉树
- patL2-011. 玩转二叉树
- L2-011. 玩转二叉树
- 天梯赛 树的遍历 玩转二叉树 (前中求后 中后求前 层次遍历 镜面反转)
- 用两个遍历建树——树的遍历、玩转二叉树
- GPLT L2-011. 玩转二叉树【递归建树+bfs】
- L2-011. 玩转二叉树
- 团体程序设计天梯赛——玩转二叉树(遍历构造二叉树)
- L2-011. 玩转二叉树
- L2-011 玩转二叉树
- L2-011. 玩转二叉树