#include <iostream>

struct node {
  int data;
  struct node *left;
  struct node *right;
};

void add_node(struct node *&root, int data) {
  if (root == 0) {
    root = new struct node;
    root->data = data;
    root->left = root->right = 0;
    return;
  }

  if (data < root->data)
    add_node(root->left, data);
  else
    add_node(root->right, data);
}

constexpr int N = 4;
void vomit_tree(struct node *root, int c) {
  if (root == 0)
    return;
  vomit_tree(root->left, c + N);
  for (int i = 0; i < c; i++) std::cout << ' ';
  std::cout << root->data << std::endl;
  vomit_tree(root->right, c + N);
}

void release_tree(struct node *&root) {
  if (root == 0)
    return;
  release_tree(root->left);
  release_tree(root->right);
  delete root;
  root = 0;
}

int main() {
  struct node *root = 0;
  add_node(root, 50);
  add_node(root, 20);
  add_node(root, 70);
  add_node(root, 10);
  add_node(root, 25);
  add_node(root, 65);
  add_node(root, 80);
  add_node(root, 8);
  add_node(root, 12);
  add_node(root, 62);
  add_node(root, 75);
  add_node(root, 90);

  vomit_tree(root, 0);

  release_tree(root);
  return 0;
}
/* end */
