#include <iostream>
#include <memory>
#include <vector>
using namespace std;
struct Node {
int data;
unique_ptr<Node> left;
unique_ptr<Node> right;
Node(int x) : data(x), left(nullptr), right(nullptr) {}
};
void insert(unique_ptr<Node>& root, int val) {
if (!root) {
root = make_unique<Node>(val);
return;
}
if (root->data == val) {
return; // Ignore duplicates
} else if (root->data > val) {
insert(root->left, val);
} else {
insert(root->right, val);
}
}
unique_ptr<Node> buildBST(vector<int>& a) {
unique_ptr<Node> root = nullptr; // Initialize to nullptr
for (int i = 0; i < a.size(); i++) {
insert(root, a[i]);
}
return root;
}
void inorder(const unique_ptr<Node>& root) {
if (!root) return; // Base case
inorder(root->left);
cout << root->data << " ";
inorder(root->right);
}
void postorder(const unique_ptr<Node>& root) {
if (!root) return; // Base case
postorder(root->left);
postorder(root->right);
cout << root->data << " ";
}
int main() {
int t;
cin >> t;
int testCase = 1; // Track test case number
while (t--) {
int n;
cin >> n;
vector<int> a(n);
for (int i = 0; i < n; i++) {
cin >> a[i];
}
auto root = buildBST(a); // Store the BST root
cout << "Test #" << testCase++ << ": ";
postorder(root);
cout << endl; // Add newline for clarity
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5PgojaW5jbHVkZSA8dmVjdG9yPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc3RydWN0IE5vZGUgewogICAgaW50IGRhdGE7CiAgICB1bmlxdWVfcHRyPE5vZGU+IGxlZnQ7CiAgICB1bmlxdWVfcHRyPE5vZGU+IHJpZ2h0OwogICAgTm9kZShpbnQgeCkgOiBkYXRhKHgpLCBsZWZ0KG51bGxwdHIpLCByaWdodChudWxscHRyKSB7fQp9OwoKdm9pZCBpbnNlcnQodW5pcXVlX3B0cjxOb2RlPiYgcm9vdCwgaW50IHZhbCkgewogICAgaWYgKCFyb290KSB7CiAgICAgICAgcm9vdCA9IG1ha2VfdW5pcXVlPE5vZGU+KHZhbCk7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKHJvb3QtPmRhdGEgPT0gdmFsKSB7CiAgICAgICAgcmV0dXJuOyAvLyBJZ25vcmUgZHVwbGljYXRlcwogICAgfSBlbHNlIGlmIChyb290LT5kYXRhID4gdmFsKSB7CiAgICAgICAgaW5zZXJ0KHJvb3QtPmxlZnQsIHZhbCk7CiAgICB9IGVsc2UgewogICAgICAgIGluc2VydChyb290LT5yaWdodCwgdmFsKTsKICAgIH0KfQoKdW5pcXVlX3B0cjxOb2RlPiBidWlsZEJTVCh2ZWN0b3I8aW50PiYgYSkgewogICAgdW5pcXVlX3B0cjxOb2RlPiByb290ID0gbnVsbHB0cjsgLy8gSW5pdGlhbGl6ZSB0byBudWxscHRyCiAgICBmb3IgKGludCBpID0gMDsgaSA8IGEuc2l6ZSgpOyBpKyspIHsKICAgICAgICBpbnNlcnQocm9vdCwgYVtpXSk7CiAgICB9CiAgICByZXR1cm4gcm9vdDsKfQoKdm9pZCBpbm9yZGVyKGNvbnN0IHVuaXF1ZV9wdHI8Tm9kZT4mIHJvb3QpIHsKICAgIGlmICghcm9vdCkgcmV0dXJuOyAvLyBCYXNlIGNhc2UKICAgIGlub3JkZXIocm9vdC0+bGVmdCk7CiAgICBjb3V0IDw8IHJvb3QtPmRhdGEgPDwgIiAiOwogICAgaW5vcmRlcihyb290LT5yaWdodCk7Cn0KCnZvaWQgcG9zdG9yZGVyKGNvbnN0IHVuaXF1ZV9wdHI8Tm9kZT4mIHJvb3QpIHsKICAgIGlmICghcm9vdCkgcmV0dXJuOyAvLyBCYXNlIGNhc2UKICAgIHBvc3RvcmRlcihyb290LT5sZWZ0KTsKICAgIHBvc3RvcmRlcihyb290LT5yaWdodCk7CiAgICBjb3V0IDw8IHJvb3QtPmRhdGEgPDwgIiAiOwp9CgppbnQgbWFpbigpIHsKICAgIGludCB0OwogICAgY2luID4+IHQ7CiAgICBpbnQgdGVzdENhc2UgPSAxOyAvLyBUcmFjayB0ZXN0IGNhc2UgbnVtYmVyCiAgICB3aGlsZSAodC0tKSB7CiAgICAgICAgaW50IG47CiAgICAgICAgY2luID4+IG47CiAgICAgICAgdmVjdG9yPGludD4gYShuKTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewogICAgICAgICAgICBjaW4gPj4gYVtpXTsKICAgICAgICB9CiAgICAgICAgYXV0byByb290ID0gYnVpbGRCU1QoYSk7IC8vIFN0b3JlIHRoZSBCU1Qgcm9vdAogICAgICAgIGNvdXQgPDwgIlRlc3QgIyIgPDwgdGVzdENhc2UrKyA8PCAiOiAiOwogICAgICAgIHBvc3RvcmRlcihyb290KTsKICAgICAgICBjb3V0IDw8IGVuZGw7IC8vIEFkZCBuZXdsaW5lIGZvciBjbGFyaXR5CiAgICB9CiAgICByZXR1cm4gMDsKfQ==