using System.Collections;
using System.Collections.Generic;
public static void Main()
Console.WriteLine("Hello World");
SortedSet<int> intSet = new SortedSet<int>();
Console.WriteLine(intSet.Max);
Console.WriteLine(intSet.Min);
public class TreeNode<T> : IComparable<T>
public T Value = default(T);
public TreeNode<T> Left = null;
public TreeNode<T> Right = null;
public TreeNode(T val, TreeNode<T> left, TreeNode<T> right)
public int CompareTo(T other)
return Value.CompareTo(other);
public enum TreeTraversalDirection
public interface ITree<T>
TreeTraversalDirection TraversalDirection {get;set;}
void Add(ICollection<T> vals);
IEnumerator GetEnumerator();
public class Tree<T> : ITree<T>
private TreeNode<T> Root {get;set;}
public TreeTraversalDirection TraversalDirection {get;set;}
public int Count {get; private set;}
public Tree(ICollection<T> vals)
Root = new TreeNode<T>(val, null, null);
public void Add(ICollection<T> vals)
private void AddTo(TreeNode<T> node, T val)
int comparison = node.Value.CompareTo(val);
node.Left = new TreeNode<T>(val, null, null);
node.Right = new TreeNode<T>(val, null, null);
public bool Remove(T val)
TreeNode<T> parent = null;
TreeNode<T> node = FindWithParent(val, out parent);
int comparison = parent.Value.CompareTo(node.Value);
else if (node.Right.Left == null)
TreeNode<T> leftMostNode = node.Right.Left;
TreeNode<T> leftMostNodeParent = node.Right;
while(leftMostNode.Left != null)
leftMostNodeParent = leftMostNode;
leftMostNode = leftMostNode.Left;
leftMostNodeParent.Left = leftMostNode.Right;
leftMostNode.Left = node.Left;
leftMostNode.Right = node.Right;
parent.Right = leftMostNode;
parent.Left = leftMostNode;
public bool Contains(T val)
TreeNode<T> parent = null;
return FindWithParent(val, out parent) != null;
private TreeNode<T> FindWithParent(T val, out TreeNode<T> parent)
TreeNode<T> current = Root;
int comparison = current.Value.CompareTo(val);
public IEnumerator GetEnumerator()
switch(TraversalDirection)
case TreeTraversalDirection.InOrder:
case TreeTraversalDirection.PreOrder:
case TreeTraversalDirection.PostOrder:
public void PreOrderTraversal(Action<T> action)
PreOrderTraversal(action, Root);
public void PreOrderTraversal(Action<T> action, TreeNode<T> node)
PreOrderTraversal(action, node.Left);
PreOrderTraversal(action, node.Right);
public void PostOrderTraversal(Action<T> action)
PostOrderTraversal(action, Root);
public void PostOrderTraversal(Action<T> action, TreeNode<T> node)
PostOrderTraversal(action, node.Left);
PostOrderTraversal(action, node.Right);
public void InOrderTraversal(Action<T> action)
InOrderTraversal(action, Root);
public void InOrderTraversal(Action<T> action, TreeNode<T> node)
InOrderTraversal(action, node.Left);
InOrderTraversal(action, node.Right);