题目
![]()
解法1
点击查看代码
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
struct TreeNode {
int left, right;
};
vector<TreeNode> tree(10);
vector<bool> isChild(10, false); // 标记是否是子节点
vector<int> levelOrder, inOrder;
void invertTree(int root) {
if (root == -1) return;
swap(tree[root].left, tree[root].right); // 交换左右子树
invertTree(tree[root].left);
invertTree(tree[root].right);
}
void level(int root) {
queue<int> q;
q.push(root);
while (!q.empty()) {
int node = q.front();
q.pop();
levelOrder.push_back(node);
if (tree[node].left != -1) q.push(tree[node].left);
if (tree[node].right != -1) q.push(tree[node].right);
}
}
void inorder(int root) {
if (root == -1) return;
inorder(tree[root].left);
inOrder.push_back(root);
inorder(tree[root].right);
}
int main() {
int N;
cin >> N;
if (N == 0) return 0;
for (int i = 0; i < N; i++) {
string l, r;
cin >> l >> r;
tree[i].left = (l == "-") ? -1 : stoi(l);
tree[i].right = (r == "-") ? -1 : stoi(r);
if (tree[i].left != -1) isChild[tree[i].left] = true;
if (tree[i].right != -1) isChild[tree[i].right] = true;
}
// 找到根节点(没有作为子节点出现的节点)
int root = -1;
for (int i = 0; i < N; i++) {
if (!isChild[i]) {
root = i;
break;
}
}
// 反转树
invertTree(root);
// 层序遍历
level(root);
// 中序遍历
inorder(root);
// 输出结果
for (int i = 0; i < levelOrder.size(); i++) {
if (i > 0) cout << " ";
cout << levelOrder[i];
}
cout << endl;
for (int i = 0; i < inOrder.size(); i++) {
if (i > 0) cout << " ";
cout << inOrder[i];
}
cout << endl;
return 0;
}