#include <iostream>
#include <utility>
#include <algorithm>
#include <list>
namespace tree {
template<typename T>
struct node
{
T data;
node* l;
node* r;
node(T&& data_ = T()) : data(std::move(data_)), l(0), r(0) {}
};
template<typename T>
int max_depth(node<T>* n)
{
if (!n) return 0;
return 1 + std::max(max_depth(n->l), max_depth(n->r));
}
template<typename T>
void prt(node<T>* n)
{
struct node_depth
{
node<T>* n;
int lvl;
node_depth(node<T>* n_, int lvl_) : n(n_), lvl(lvl_) {}
};
int depth = max_depth(n);
char buf[1024];
int last_lvl = 0;
int offset = (1 << depth) - 1;
// using a queue means we perform a breadth first iteration through the tree
std::list<node_depth> q;
q.push_back(node_depth(n, last_lvl));
while (q.size())
{
const node_depth& nd = *q.begin();
// moving to a new level in the tree, output a new line and calculate new offset
if (last_lvl != nd.lvl)
{
std::cout << "\n";
last_lvl = nd.lvl;
offset = (1 << (depth - nd.lvl)) - 1;
}
// output <offset><data><offset>
if (nd.n)
sprintf(buf, " %*s%d%*s", offset, " ", nd.n->data, offset, " ");
else
sprintf(buf, " %*s", offset << 1, " ");
std::cout << buf;
if (nd.n)
{
q.push_back(node_depth(nd.n->l, last_lvl + 1));
q.push_back(node_depth(nd.n->r, last_lvl + 1));
}
q.pop_front();
}
std::cout << "\n";
}
}
int main()
{
typedef tree::node<int> node;
node* head = new node();
head->l = new node(1);
head->r = new node(2);
head->l->l = new node(3);
head->l->r = new node(4);
head->r->l = new node(5);
head->r->r = new node(6);
tree::prt(head);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dXRpbGl0eT4KI2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGxpc3Q+CgpuYW1lc3BhY2UgdHJlZSB7Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgpzdHJ1Y3Qgbm9kZQp7CiAgVCBkYXRhOwogIG5vZGUqIGw7CiAgbm9kZSogcjsKICBub2RlKFQmJiBkYXRhXyA9IFQoKSkgOiBkYXRhKHN0ZDo6bW92ZShkYXRhXykpLCBsKDApLCByKDApIHt9Cn07Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgppbnQgbWF4X2RlcHRoKG5vZGU8VD4qIG4pCnsKICBpZiAoIW4pIHJldHVybiAwOwogIHJldHVybiAxICsgc3RkOjptYXgobWF4X2RlcHRoKG4tPmwpLCBtYXhfZGVwdGgobi0+cikpOwp9Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgp2b2lkIHBydChub2RlPFQ+KiBuKQp7CiAgc3RydWN0IG5vZGVfZGVwdGgKICB7CiAgICBub2RlPFQ+KiBuOwogICAgaW50IGx2bDsKICAgIG5vZGVfZGVwdGgobm9kZTxUPiogbl8sIGludCBsdmxfKSA6IG4obl8pLCBsdmwobHZsXykge30KICB9OwoKICBpbnQgZGVwdGggPSBtYXhfZGVwdGgobik7CgogIGNoYXIgYnVmWzEwMjRdOwogIGludCBsYXN0X2x2bCA9IDA7CiAgaW50IG9mZnNldCA9ICgxIDw8IGRlcHRoKSAtIDE7CgogIC8vIHVzaW5nIGEgcXVldWUgbWVhbnMgd2UgcGVyZm9ybSBhIGJyZWFkdGggZmlyc3QgaXRlcmF0aW9uIHRocm91Z2ggdGhlIHRyZWUKICBzdGQ6Omxpc3Q8bm9kZV9kZXB0aD4gcTsKCiAgcS5wdXNoX2JhY2sobm9kZV9kZXB0aChuLCBsYXN0X2x2bCkpOwogIHdoaWxlIChxLnNpemUoKSkKICB7CiAgICBjb25zdCBub2RlX2RlcHRoJiBuZCA9ICpxLmJlZ2luKCk7CgogICAgLy8gbW92aW5nIHRvIGEgbmV3IGxldmVsIGluIHRoZSB0cmVlLCBvdXRwdXQgYSBuZXcgbGluZSBhbmQgY2FsY3VsYXRlIG5ldyBvZmZzZXQKICAgIGlmIChsYXN0X2x2bCAhPSBuZC5sdmwpCiAgICB7CiAgICAgIHN0ZDo6Y291dCA8PCAiXG4iOwoKICAgICAgbGFzdF9sdmwgPSBuZC5sdmw7CiAgICAgIG9mZnNldCA9ICgxIDw8IChkZXB0aCAtIG5kLmx2bCkpIC0gMTsKICAgIH0KCiAgICAvLyBvdXRwdXQgPG9mZnNldD48ZGF0YT48b2Zmc2V0PgogICAgaWYgKG5kLm4pCiAgICAgIHNwcmludGYoYnVmLCAiICUqcyVkJSpzIiwgb2Zmc2V0LCAiICIsIG5kLm4tPmRhdGEsIG9mZnNldCwgIiAiKTsKICAgIGVsc2UKICAgICAgc3ByaW50ZihidWYsICIgJSpzIiwgb2Zmc2V0IDw8IDEsICIgIik7CiAgICBzdGQ6OmNvdXQgPDwgYnVmOwoKICAgIGlmIChuZC5uKQogICAgewogICAgICBxLnB1c2hfYmFjayhub2RlX2RlcHRoKG5kLm4tPmwsIGxhc3RfbHZsICsgMSkpOwogICAgICBxLnB1c2hfYmFjayhub2RlX2RlcHRoKG5kLm4tPnIsIGxhc3RfbHZsICsgMSkpOwogICAgfQoKICAgIHEucG9wX2Zyb250KCk7CiAgfQogIHN0ZDo6Y291dCA8PCAiXG4iOwp9Cgp9CgppbnQgbWFpbigpCnsKICB0eXBlZGVmIHRyZWU6Om5vZGU8aW50PiBub2RlOwogIG5vZGUqIGhlYWQgPSBuZXcgbm9kZSgpOwogIGhlYWQtPmwgICAgPSBuZXcgbm9kZSgxKTsKICBoZWFkLT5yICAgID0gbmV3IG5vZGUoMik7CiAgaGVhZC0+bC0+bCA9IG5ldyBub2RlKDMpOwogIGhlYWQtPmwtPnIgPSBuZXcgbm9kZSg0KTsKICBoZWFkLT5yLT5sID0gbmV3IG5vZGUoNSk7CiAgaGVhZC0+ci0+ciA9IG5ldyBub2RlKDYpOwoKICB0cmVlOjpwcnQoaGVhZCk7CgogIHJldHVybiAwOwp9