L2-011. 玩转二叉树
时间限制
400 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
陈越
给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列。所谓镜面反转,是指将所有非叶结点的左右孩子对换。这里假设键值都是互不相等的正整数。
输入格式:
输入第一行给出一个正整数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 大体题意: 给你二叉树的中序遍历和前序遍历,然后再将所有非叶结点左右孩子对换,最后层序遍历输出。 思路: 分析下样例,思路很明确,先根据中序遍历和前序遍历用链表的方式构造出二叉树,然后再层序遍历输出即可,只不过这里的层序遍历是先右后左的方式。 构造二叉树用结构体递归做,层序遍历直接bfs即可!#include<cstdio> #include<cstring> #include<algorithm> #include<queue> using namespace std; int *pre,*in,n; int *ans; int cnt; struct Node{ int v; Node* left,*right; }*root; queue<Node*>q; int cnt2 = 0; Node *build(int *pre,int *in,int len){ if (len == 0)return NULL; Node * node = new Node; node->v = *pre; ++cnt2; if (cnt2==1)root = node; int rootdex = 0; for (; rootdex < n; ++rootdex)if (in[rootdex] == *pre)break; node->left = build(pre+1,in,rootdex); node->right = build(pre+1+rootdex,in+rootdex+1,len-rootdex-1); return node; } void print(){ while(!q.empty())q.pop(); q.push(root); while(!q.empty()){ Node *u = q.front();q.pop(); ans[cnt++] = u->v; if (u->right != NULL)q.push(u->right); if (u->left != NULL)q.push(u->left); } for (int i = 0; i < cnt; ++i){ if (i)printf(" "); printf("%d",ans[i]); } } int main(){ scanf("%d",&n); pre = new int[n]; in = new int[n]; ans = new int[n]; cnt = 0; for (int i = 0; i < n; ++i)scanf("%d",&in[i]); for (int i = 0; i < n; ++i)scanf("%d",&pre[i]); build(pre,in,n); print(); return 0; }