var values = new[] { 50, 25, 75, 10, 30, 5, 7, 3, 70, 80 };
Node<int>? returnTree = null;
foreach(var value in values)
returnTree = TreeInsert(returnTree, value);
Console.WriteLine("Tree built using return values");
Node<int>? refTree = null;
foreach (var value in values)
TreeInsertRef(ref refTree, value);
Console.WriteLine("Tree built using ref parameters");
Node<T> TreeInsert<T>(Node<T>? node, T value) where T : IComparable<T>
return new Node<T>(value);
var compare = value.CompareTo(node.Value);
node.Left = TreeInsert<T>(node.Left, value);
node.Right = TreeInsert<T>(node.Right, value);
throw new InvalidOperationException();
void TreeInsertRef<T>(ref Node<T>? node, T value) where T : IComparable<T>
node = new Node<T>(value);
var compare = value.CompareTo(node.Value);
TreeInsertRef<T>(ref temp, value);
TreeInsertRef<T>(ref temp, value);
throw new InvalidOperationException();
void DumpTree<T>(Node<T>? root)
Console.WriteLine(root.Value);
DumpChild("", root.Left, root.Right != null);
DumpChild("", root.Right, false);
void DumpChild(string pad, Node<T>? node, bool hasSibling)
Console.Write(hasSibling ? "+-" : "--");
Console.WriteLine(node.Value);
pad += hasSibling ? "| " : " ";
DumpChild(pad, node.Left, node.Right != null);
DumpChild(pad, node.Right, false);
public T Value { get; set; }
public Node<T>? Left { get; set; }
public Node<T>? Right { get; set; }
public Node(T value) => Value = value;