#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;
}