给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列。所谓镜面反转,是指将所有非叶结点的左右孩子对换。这里假设键值都是互不相等的正整数。
输入格式:
输入第一行给出一个正整数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
#include <iostream>
#include<set>
#include<map>
#include<queue>
using namespace std;
/*
思路:先由前序遍历和中序遍历确定一个二叉树
对二叉树进行镜面反转
反转后的内容进行层序遍历
*/
int n;
typedef struct stree* Tree;
struct stree {
int value;
stree* left;
stree* right;
};
int data1[34], data2[34];
stree* creatT() {
Tree s = (Tree)malloc(sizeof(stree));
if (s) {
s->left = s->right = NULL;
return s;
}
else {
cout << "内存分配失败" << endl;
return NULL;
}
}
Tree buildT(int s1, int e1, int s2, int e2) {//由前序和中序确定二叉树
if(s1 > e1){
return NULL;
}
Tree ret = creatT();
ret->value = data1[s1];
int rootindex;
for (int i = s2; i <= e2; i++) {
if (data2[i] == data1[s1]) {
rootindex = i;
break;
}
}
ret->left = buildT(s1 + 1, s1 + (rootindex - s2), s2, rootindex - 1);
ret->right = buildT(s1 + (rootindex - s2) + 1, e1, rootindex + 1, e2);
return ret;
}
void tran(Tree s) {
if (s == NULL || s->left == NULL && s->right == NULL) {
return;
}
Tree temp = s->left;
s->left = s->right;
s->right = temp;
tran(s->left);
tran(s->right);
}
void Seq(Tree s) {
queue<Tree> q;
int i = 0;
q.push(s);
while (!q.empty()) {
Tree root = q.front();
cout << root->value;
i++;
if(i != n){
cout << " ";
}
q.pop();
if (root->left) {
q.push(root->left);
}
if (root->right) {
q.push(root->right);
}
}
}
int main() {
cin >> n;
for (int i = 0; i < n; i++) {
cin >> data2[i];
}
for (int i = 0; i < n; i++) {
cin >> data1[i];
}
Tree newS = buildT(0, n - 1, 0, n - 1);
tran(newS);
Seq(newS);
return 0;
}