// Copy the child key to the parent until a leaf is
  // found and remove the leaf. This is done with the
  // left subtree
  public boolean RemoveLeft(Tree p_node, Tree c_node) {
    boolean ntb;

    while (c_node.GetHas_Left()) {
      // auxtree01 = c_node.GetLeft() ;
      // auxint02 = auxtree01.GetKey();
      // ntb = c_node.SetKey(auxint02);
      ntb = c_node.SetKey((c_node.GetLeft()).GetKey());
      p_node = c_node;
      c_node = c_node.GetLeft();
    }
    ntb = p_node.SetLeft(my_null);
    ntb = p_node.SetHas_Left(false);
    return true;
  }
  // Insert a new element in the tree
  public boolean Insert(int v_key) {
    Tree new_node;
    boolean ntb;
    boolean cont;
    int key_aux;
    Tree current_node;

    new_node = new Tree();
    ntb = new_node.Init(v_key);
    current_node = this;
    cont = true;
    while (cont) {
      key_aux = current_node.GetKey();
      if (v_key < key_aux) {
        if (current_node.GetHas_Left()) current_node = current_node.GetLeft();
        else {
          cont = false;
          ntb = current_node.SetHas_Left(true);
          ntb = current_node.SetLeft(new_node);
        }
      } else {
        if (current_node.GetHas_Right()) current_node = current_node.GetRight();
        else {
          cont = false;
          ntb = current_node.SetHas_Right(true);
          ntb = current_node.SetRight(new_node);
        }
      }
    }
    return true;
  }
  // Print the elements of the tree
  public boolean RecPrint(Tree node) {
    boolean ntb;

    if (node.GetHas_Left()) {
      // auxtree01 = node.GetLeft() ;
      // ntb = this.RecPrint(auxtree01);
      ntb = this.RecPrint(node.GetLeft());
    } else ntb = true;
    System.out.println(node.GetKey());
    if (node.GetHas_Right()) {
      // auxtree01 = node.GetRight() ;
      // ntb = this.RecPrint(auxtree01);
      ntb = this.RecPrint(node.GetRight());
    } else ntb = true;
    return true;
  }
  // Check if the element to be removed will use the
  // righ or left subtree if one exists
  public boolean Remove(Tree p_node, Tree c_node) {
    boolean ntb;
    int auxkey1;
    int auxkey2;

    if (c_node.GetHas_Left()) ntb = this.RemoveLeft(p_node, c_node);
    else if (c_node.GetHas_Right()) ntb = this.RemoveRight(p_node, c_node);
    else {
      auxkey1 = c_node.GetKey();
      // auxtree01 = p_node.GetLeft() ;
      // auxkey2 = auxtree01.GetKey() ;
      auxkey2 = (p_node.GetLeft()).GetKey();
      if (this.Compare(auxkey1, auxkey2)) {
        ntb = p_node.SetLeft(my_null);
        ntb = p_node.SetHas_Left(false);
      } else {
        ntb = p_node.SetRight(my_null);
        ntb = p_node.SetHas_Right(false);
      }
    }
    return true;
  }
  // Delete an element from the tree
  public boolean Delete(int v_key) {
    Tree current_node;
    Tree parent_node;
    boolean cont;
    boolean found;
    boolean is_root;
    int key_aux;
    boolean ntb;

    current_node = this;
    parent_node = this;
    cont = true;
    found = false;
    is_root = true;
    while (cont) {
      key_aux = current_node.GetKey();
      if (v_key < key_aux)
        if (current_node.GetHas_Left()) {
          parent_node = current_node;
          current_node = current_node.GetLeft();
        } else cont = false;
      else if (key_aux < v_key)
        if (current_node.GetHas_Right()) {
          parent_node = current_node;
          current_node = current_node.GetRight();
        } else cont = false;
      else {
        if (is_root)
          if ((!current_node.GetHas_Right()) && (!current_node.GetHas_Left())) ntb = true;
          else ntb = this.Remove(parent_node, current_node);
        else ntb = this.Remove(parent_node, current_node);
        found = true;
        cont = false;
      }
      is_root = false;
    }
    return found;
  }
  // Search for an elemnt in the tree
  public int Search(int v_key) {
    boolean cont;
    int ifound;
    Tree current_node;
    int key_aux;

    current_node = this;
    cont = true;
    ifound = 0;
    while (cont) {
      key_aux = current_node.GetKey();
      if (v_key < key_aux)
        if (current_node.GetHas_Left()) current_node = current_node.GetLeft();
        else cont = false;
      else if (key_aux < v_key)
        if (current_node.GetHas_Right()) current_node = current_node.GetRight();
        else cont = false;
      else {
        ifound = 1;
        cont = false;
      }
    }
    return ifound;
  }