/* cs */
using System;
using System.Collections.Generic;

class Node<T> { 
  private T key;
  private Node<T> left, right;
  public Node(T key) {
    this.left = this.right = null;
    this.key = key;
  }
  
  public static void insertNode(ref Node<T> root, T key) {
  	insertNode(ref root, key, Comparer<T>.Default);
  }
  
  public static void insertNode(ref Node<T> root, T key, IComparer<T> comparer) {
    if (root == null) {
      root = new Node<T>(key);
      return;
    }
    if (comparer.Compare(key, root.key) < 0)
      insertNode(ref root.left, key, comparer);
    else
      insertNode(ref root.right, key, comparer);
  }
  
  public static bool deleteNode(ref Node<T> root, T key) {
  	return deleteNode(ref root, key, Comparer<T>.Default);
  }
  
  public static bool deleteNode(ref Node<T> root, T key, IComparer<T> comparer) {
    if (root == null) return false;
    if (comparer.Compare(key, root.key) < 0)
      return deleteNode(ref root.left, key, comparer);
    else if (comparer.Compare(key, root.key) > 0)
      return deleteNode(ref root.right, key, comparer);
    else {
      if (root.left == null) {
        root = root.right;
      } else if (root.right == null) {
        root = root.left;
      } else { // root.left != null && root.right != null
        Node<T> p;
        for (p = root.left; p.right != null; p = p.right)
          ;
        p.right = root.right;
        root = root.left;
      }
    }
    return true;
  }

  public void vomitTree(int c) {
    if (this.left != null)
      this.left.vomitTree(c + 3);
    for (int i = 0; i < c; i++) Console.Write(' ');
    Console.WriteLine(this.key);
    if (this.right != null)
      this.right.vomitTree(c + 3);
  }
}

class BinaryTree<T> {
  private Node<T> root;
  public BinaryTree() { this.root = null; }
  public void insertNode(T key) { Node<T>.insertNode(ref this.root, key); }
  public bool deleteNode(T key) { return Node<T>.deleteNode(ref this.root, key); } 
  public void vomitTree() { if (this.root != null) this.root.vomitTree(0); }
}

class Sample{
  public static void Main() {
    var tree = new BinaryTree<int>();
    for (;;) {
      Console.Write("> ");
      int input = int.Parse(Console.ReadLine());
      if (input < 0)
        break;
      tree.insertNode(input);
      tree.vomitTree();
    }
    Console.WriteLine("deleting.");
    for (;;) {
      Console.Write("> ");
      int input = int.Parse(Console.ReadLine());
      if (input < 0)
        break;
      if (tree.deleteNode(input))
        Console.WriteLine("deleted.");
      else
        Console.WriteLine("not found.");
      tree.vomitTree();
    }
  }
}
/* end */
