https://www.patest.cn/contests/gplt/L2-011
题意:给你中序前序求层序镜像。
思路:根据中序前序建树,和hdu1710一样。接着层序遍历,就是bfs。不用变成镜像然后遍历,只需让右节点先进队列即可。
#include <stdio.h> #include <algorithm> #include <string.h> #include <queue> #include <iostream> using namespace std; typedef long long ll; const int N = 35; int cnt, n; typedef struct Tree { Tree *left; Tree *right; int val; }Tree; Tree *root; Tree* creat(int *preorder, int *inorder, int n)//前序、后序和子树长度 { Tree *tmp; for(int i = 0; i < n; i++) { if(preorder[0]==inorder[i])//在中序中找到这个根节点 { tmp = (Tree*)malloc(sizeof(Tree)); tmp->val = inorder[i]; tmp->left = creat(preorder+1, inorder, i); tmp->right = creat(preorder+i+1, inorder+i+1, n-(i+1)); return tmp; } } return NULL; } void levelorder(Tree *cur) { cnt = 0; queue<Tree*>que; while(!que.empty()) que.pop(); que.push(cur); Tree *node; while(!que.empty()) { node = que.front(); que.pop(); if(cnt == n-1) printf("%d\n", node->val); else { printf("%d ", node->val); cnt++; } if(node->right != NULL) que.push(node->right); if(node->left != NULL) que.push(node->left); } } int main() { // freopen("in.txt", "r", stdin); int preorder[N], inorder[N]; while(~scanf("%d", &n)) { for(int i = 0; i < n; i++) scanf("%d", &inorder[i]); for(int i = 0; i < n; i++) scanf("%d", &preorder[i]); root = creat(preorder, inorder, n); levelorder(root); } }