#include <iostream>
//#include <cstdlib>
#include <stdlib.h>

class Node {
private:
  int data;
  Node *left, *right;
public:
  static void push(Node *&root, int data) {
    Node *p;
    if (!root) {
      p = new Node();
      p->data = data;
      p->left = p->right = 0;
      root = p;
      return;
    } 
    if (data < root->data)
      push(root->left, data);
    else
      push(root->right, data);
  }
  static bool pop(Node *&root, int &data) {
    Node *p;
    if (root == 0)
      return false;
    if (root->left) {
      return pop(root->left, data);
    }
    p = root;
    data = p->data;
    root = p->right;
    delete p;
    return true;
  }
};

class BinTree {
private:
  Node *root;
public:
  BinTree() { root = 0; }
  void pushNode(int data) { Node::push(root, data); }
  bool popNode(int &data) { return Node::pop(root, data); }
};

int main() {
  const int n = 10;
  const int max = 1000;
  const int seed = 31415926;
  int data;
  BinTree *obj = new BinTree();
  srand(seed);
  for (int i = 0; i < n; i++) {
    data = rand() % max;
    obj->pushNode(data);
  }
  std::cout << "C++(2)" << std::endl;
  while (obj->popNode(data))
    std::cout << data << std::endl;
  delete obj;
  return 0;
}
/* end */
