题目


解法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;
}