text: 
  var TreeBase = require('./treebase');
  
  function Node(data) {
      this.data = data;
      this.left = null;
      this.right = null;
  }
  
  Node.prototype.get_child = function(dir) {
      return dir ? this.right : this.left;
  };
  
  Node.prototype.set_child = function(dir, val) {
      if(dir) {
          this.right = val;
      }
      else {
          this.left = val;
      }
  };
  
  function BinTree(comparator) {
      this._root = null;
      this._comparator = comparator;
      this.size = 0;
  }
  
  BinTree.prototype = new TreeBase();
  
  // returns true if inserted, false if duplicate
  BinTree.prototype.insert = function(data) {
      if(this._root === null) {
          // empty tree
          this._root = new Node(data);
          this.size++;
          return true;
      }
  
      var dir = 0;
  
      // setup
      var p = null; // parent
      var node = this._root;
  
      // search down
      while(true) {
          if(node === null) {
              // insert new node at the bottom
              node = new Node(data);
              p.set_child(dir, node);
              ret = true;
              this.size++;
              return true;
          }
  
          // stop if found
          if(this._comparator(node.data, data) === 0) {
              return false;
          }
  
          dir = this._comparator(node.data, data) < 0;
  
          // update helpers
          p = node;
          node = node.get_child(dir);
      }
  };
  
  // returns true if removed, false if not found
  BinTree.prototype.remove = function(data) {
      if(this._root === null) {
          return false;
      }
  
      var head = new Node(undefined); // fake tree root
      var node = head;
      node.right = this._root;
      var p = null; // parent
      var found = null; // found item
      var dir = 1;
  
      while(node.get_child(dir) !== null) {
          p = node;
          node = node.get_child(dir);
          var cmp = this._comparator(data, node.data);
          dir = cmp > 0;
  
          if(cmp === 0) {
              found = node;
          }
      }
  
      if(found !== null) {
          found.data = node.data;
          p.set_child(p.right === node, node.get_child(node.left === null));
  
          this._root = head.right;
          this.size--;
          return true;
      }
      else {
          return false;
      }
  };
  
  module.exports = BinTree;
  
  