给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列。所谓镜面反转,是指将所有非叶结点的左右孩子对换。这里假设键值都是互不相等的正整数。
输入格式:
输入第一行给出一个正整数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
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
ACcode:
#include<iostream>
#include<queue>
using namespace std;
struct TreeNode
{
int data;
TreeNode* lchild;
TreeNode* rchild;
};
TreeNode* create_tree(int*,int*,int&,int,int);
TreeNode* ReverseTree(TreeNode*);
void ForTree(TreeNode*,int);
int main(){
int n;
cin >> n;
int pre[30], in[30];
for (int i = 0; i< n; i++) {
cin >> in[i];
}
for (int i = 0; i < n; i++) {
cin >> pre[i];
}
int index = 0;
TreeNode* tree = create_tree(pre, in, index, 0, n - 1);
ReverseTree(tree);
ForTree(tree,n);
}
TreeNode* create_tree(int* pre, int* in, int& index, int start, int end) {
if (start > end) return NULL;
int i = 0;
for (i = start; i <= end; i++) {
if (pre[index] == in[i]) break;
}
TreeNode* new_node = new TreeNode({pre[index++], NULL, NULL});
new_node->lchild = create_tree(pre, in, index, start, i - 1);
new_node->rchild = create_tree(pre, in, index, i + 1, end);
return new_node;
}
TreeNode* ReverseTree(TreeNode * T) {
if (!T) return NULL;
if (!T->lchild && !T->rchild) return T;
TreeNode* tmp = NULL;
tmp = ReverseTree(T->lchild);
T->lchild = ReverseTree(T->rchild);
T->rchild = tmp;
return T;
}
void ForTree(TreeNode* tree,int num) {
queue<TreeNode*> q;
int cnt = 0;
q.push(tree);
while (!q.empty()) {
TreeNode* tmp= q.front();
q.pop();
if (!tmp) continue;
cout << tmp->data;
cnt++;
if (cnt < num) cout << " ";
q.push(tmp->lchild);
q.push(tmp->rchild);
}
}