// 结构体指针

#include <bits/stdc++.h>
using namespace std;

struct TreeNode { // 定义二叉树的结点结构体
    int val; // 结点的值
    TreeNode *left; // 左子结点
    TreeNode *right; // 右子结点
    TreeNode() : val(INT_MIN), left(nullptr), right(nullptr) {} // 构造函数
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} // 构造函数
    TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} // 构造函数
};

TreeNode* invertTree(TreeNode* root) {
    if (root == nullptr) { // 如果二叉树为空
        return nullptr; // 返回空指针
    }
    TreeNode* left = invertTree(root->left); // 将左子树的根结点赋值给指针变量left
    TreeNode* right = invertTree(root->right); // 将右子树的根结点赋值给指针变量right
    root->left = right; // 将指针变量right赋值给结点root的左子结点
    root->right = left; // 将指针变量left赋值给结点root的右子结点
    return root; // 返回结点root
}

TreeNode *buildTree(vector<int> &nums, int index) { // 建立二叉树
    if (index >= int(nums.size())) { // 如果index大于等于数组nums的长度
        return nullptr; // 返回空指针
    }
    TreeNode *root = new TreeNode(nums[index]); // 创建二叉树的根结点
    root->left = buildTree(nums, 2 * index + 1); // 创建二叉树的左子树
    root->right = buildTree(nums, 2 * index + 2); // 创建二叉树的右子树
    return root; // 返回结点root
}

void printLevelOrder(TreeNode *root) { // 层序遍历输出
    if (!root) return;
    queue<TreeNode *> que;
    que.push(root);
    while (!que.empty()) {
        TreeNode *p = que.front();
        que.pop();
        cout << p->val << " ";
        if (p->left) que.push(p->left);
        if (p->right) que.push(p->right);
    }
}

void printPreOrder(TreeNode *root) { // 先序遍历输出
    if (!root) return;
    cout << root->val << " ";
    printPreOrder(root->left);
    printPreOrder(root->right);
}

void printInOrder(TreeNode *root) { // 中序遍历输出
    if (!root) return;
    printInOrder(root->left);
    cout << root->val << " ";
    printInOrder(root->right);
}

void printPostOrder(TreeNode *root) { // 后序遍历输出
    if (!root) return;
    printPostOrder(root->left);
    printPostOrder(root->right);
    cout << root->val << " ";
}

int main() {
    int num;
    vector<int> nums; // 定义vector容器nums
    while(cin >> num) nums.push_back(num); // 输入二叉树的结点值
    TreeNode *root = buildTree(nums, 0); // 建立二叉树
    TreeNode *ans = invertTree(root); // 将函数invertTree的返回值赋值给指针变量ans
    printLevelOrder(ans); // 层序遍历输出
    return 0;
}