题目链接https://pintia.cn/problem-sets/994805342720868352/problems/994805365537882112
题目大意:给出一棵二叉树,求反转二叉树的层序和中序遍历。
思路:和1099很像,只需要把层序和中序遍历的【从左到右】换成从右到左即可。因为根节点是哪个没讲,所以在读数据时先记录下,没有父亲的那个就是根。
完整代码
#include <iostream>
#include <cstdio>
#include <cmath>
#include <vector>
#include <algorithm>
#include <queue>
#include <map>
using namespace std;
class Node {
public:
int val;
int left_idx, right_idx;
};
int N;
vector<Node> tree;
bool flag = true;
void levelOrder(int root) {
bool isFirst = true;
queue<Node> q;
q.push(tree[root]);
while (q.empty() == false) {
if (q.front().right_idx != -1)
q.push(tree[q.front().right_idx]);
if (q.front().left_idx != -1)
q.push(tree[q.front().left_idx]);
if (!isFirst) {
printf(" %d", q.front().val);
}
else {
printf("%d", q.front().val);
isFirst = false;
}
q.pop();
}
printf("\n");
}
void inOrder(int idx) {
if (tree[idx].right_idx != -1)
inOrder(tree[idx].right_idx);
if (!flag)
printf(" %d", idx);
else {
printf("%d", idx);
flag = false;
}
if (tree[idx].left_idx != -1)
inOrder(tree[idx].left_idx);
}
int main() {
scanf("%d\n", &N);
if (N == 0)
return 0;
tree.resize(N);
vector<bool> isRoot(N, true);
for (int i = 0; i < N; i++) {
tree[i].val = i;
string l, r;
cin >> l >> r;
if (l[0] != '-'){
tree[i].left_idx = stoi(l);
isRoot[stoi(l)] = false;
}
else
tree[i].left_idx = -1;
if (r[0] != '-') {
tree[i].right_idx = stoi(r);
isRoot[stoi(r)] = false;
}
else
tree[i].right_idx = -1;
}
int root = -1;
for (int i = 0; i < N; i++) {
if (isRoot[i]) {
root = i;
break;
}
}
levelOrder(root);
inOrder(root);
return 0;
}