public static void Main()
BinaryTree binaryTree = new BinaryTree();
Node node = binaryTree.Find(5);
int depth = binaryTree.GetTreeDepth();
Console.WriteLine("PreOrder Traversal:");
binaryTree.TraversePreOrder(binaryTree.Root);
Console.WriteLine("InOrder Traversal:");
binaryTree.TraverseInOrder(binaryTree.Root);
Console.WriteLine("PostOrder Traversal:");
binaryTree.TraversePostOrder(binaryTree.Root);
Console.WriteLine("PreOrder Traversal After Removing Operation:");
binaryTree.TraversePreOrder(binaryTree.Root);
public Node LeftNode { get; set; }
public Node RightNode { get; set; }
public int Data { get; set; }
public Node Root { get; set; }
public bool Add(int value)
Node before = null, after = this.Root;
else if (value > after.Data)
Node newNode = new Node();
before.LeftNode = newNode;
before.RightNode = newNode;
public Node Find(int value)
return this.Find(value, this.Root);
public void Remove(int value)
this.Root = Remove(this.Root, value);
private Node Remove(Node parent, int key)
if (parent == null) return parent;
if (key < parent.Data) parent.LeftNode = Remove(parent.LeftNode, key); else if (key > parent.Data)
parent.RightNode = Remove(parent.RightNode, key);
if (parent.LeftNode == null)
else if (parent.RightNode == null)
parent.Data = MinValue(parent.RightNode);
parent.RightNode = Remove(parent.RightNode, parent.Data);
private int MinValue(Node node)
while (node.LeftNode != null)
minv = node.LeftNode.Data;
private Node Find(int value, Node parent)
if (value == parent.Data) return parent;
return Find(value, parent.LeftNode);
return Find(value, parent.RightNode);
public int GetTreeDepth()
return this.GetTreeDepth(this.Root);
private int GetTreeDepth(Node parent)
return parent == null ? 0 : Math.Max(GetTreeDepth(parent.LeftNode), GetTreeDepth(parent.RightNode)) + 1;
public String TraversePreOrder(Node parent)
Console.Write(parent.Data + " ");
TraversePreOrder(parent.LeftNode);
TraversePreOrder(parent.RightNode);
return parent.Data.ToString();
public void TraverseInOrder(Node parent)
TraverseInOrder(parent.LeftNode);
Console.Write(parent.Data + " ");
TraverseInOrder(parent.RightNode);
public void TraversePostOrder(Node parent)
TraversePostOrder(parent.LeftNode);
TraversePostOrder(parent.RightNode);
Console.Write(parent.Data + " ");