2-1 玩转二叉树

分数 6

作者 陈越

单位 浙江大学

给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列。所谓镜面反转,是指将所有非叶结点的左右孩子对换。这里假设键值都是互不相等的正整数。

输入格式:

输入第一行给出一个正整数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 <queue>
using namespace std;
// 二叉树节点结构
typedef struct BiTNode {
int data;
struct BiTNode* lchild, * rchild;
}BiTNode, * BiTree;

// 独立的节点创建函数(替代构造函数,负责初始化节点)
BiTNode* createNode(int x) {
BiTNode* node = (BiTNode*)malloc(sizeof(BiTNode));
node->data = x;
node->lchild = NULL;
node->rchild = NULL;

return node;
}

// 辅助函数:在中序遍历数组中查找根节点的索引
int findInOrder(int in[], int inStart, int inEnd, int target) {
int i = inStart;
while (i <= inEnd) {
if (in[i] == target) {
return i;
}
i += 1;
}
return -1;
}

// 构建二叉树
BiTree buildTree(int pre[], int preStart, int preEnd,
int in[], int inStart, int inEnd) {
if (preStart > preEnd || inStart > inEnd) {
return NULL;
}

int rootVal = pre[preStart];
BiTree root = createNode(rootVal);
int inRoot = findInOrder(in, inStart, inEnd, rootVal);
int leftSize = inRoot - inStart;

int leftPreStart = preStart + 1;
int leftPreEnd = preStart + leftSize;
int leftInStart = inStart;
int leftInEnd = inRoot - 1;
root->lchild = buildTree(pre, leftPreStart,
leftPreEnd, in, leftInStart, leftInEnd);

int rightPreStart = preStart + leftSize + 1;
int rightPreEnd = preEnd;
int rightInStart = inRoot + 1;
int rightInEnd = inEnd;
root->rchild = buildTree(pre, rightPreStart,
rightPreEnd, in, rightInStart, rightInEnd);

return root;
}

void mirror(BiTree root) {
if (root == NULL) {
return;
}
BiTNode* temp = root->lchild;
root->lchild = root->rchild;
root->rchild = temp;
mirror(root->rchild);
mirror(root->lchild);
}

void levelOrder(BiTree root, int result[], int& len) {
len = 0;
if (root == NULL) {
return;
}
queue<BiTree> q;
q.push(root);
while (q.empty() == false) {
BiTree node = q.front();
q.pop();
result[len] = node->data;
len += 1;
if (node->lchild != NULL) {
q.push(node->lchild);
}
if (node->rchild != NULL) {
q.push(node->rchild);
}
}
}

int main() {
int N;
cin >> N;
int in[30], pre[30];
int i = 0;
while (i < N) {
cin >> in[i];
i += 1;
}
i = 0;
while (i < N) {
cin >> pre[i];
i += 1;
}

BiTree root = buildTree(pre, 0, N - 1, in, 0, N - 1);
mirror(root);
int result[30], len;
levelOrder(root, result, len);

i = 0;
while (i < len) {
if (i > 0) {
cout << " ";
}
cout << result[i];
i += 1;
}
cout << endl;

return 0;
}