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

struct TreeNode {
    int val;
    unique_ptr<TreeNode> left, right;
    TreeNode() : val(INT_MIN), left(nullptr), right(nullptr) {}
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
    TreeNode(int x, unique_ptr<TreeNode> _left, unique_ptr<TreeNode> _right) : val(x), left(std::move(_left)), right(std::move(_right)) {}
};

typedef unique_ptr<TreeNode> TreePtr;

TreePtr buildBT(vector<int> &nums, int index) {
    if (index >= nums.size() || nums[index] == INT_MIN) {
        return nullptr;
    }
    TreePtr root = make_unique<TreeNode>(nums[index]);
    root->left = buildBT(nums, 2 * index + 1);
    root->right = buildBT(nums, 2 * index + 2);
    return root;
}

void LevelOrder(TreePtr& root) {
    if (!root) return;
    queue<TreeNode*> q;
    q.push(root.get());
    while (!q.empty()) {
        TreeNode* cur = q.front();
        q.pop();
        cout << cur->val << " ";
        if (cur->left) {
            q.push(cur->left.get());
        }
        if (cur->right) {
            q.push(cur->right.get());
        }
    }
}

void PreOrder(TreeNode* root) {
    if (!root) return;
    cout << root->val << " ";
    PreOrder(root->left.get());
    PreOrder(root->right.get());
}

void InOrder(TreeNode* root) {
    if (!root) return;
    
    InOrder(root->left.get());
    cout << root->val << " ";
    InOrder(root->right.get());
}

void PostOrder(TreeNode* root) {
    if (!root) return;
    PostOrder(root->left.get());
    PostOrder(root->right.get());
    cout << root->val << " ";
}

int main() {
    return 0;
}