C# Binary Search Tree Implementation
This example shows how to implement a Binary Search Tree using C#. A tree whose nodes have at most 2 child nodes is called a binary tree. we name them the left and right child because each node in a binary tree can have only 2 children.
A sample binary tree:
Tree Traversals (PreOrder, InOrder, PostOrder)
Traversal is a process to visit all the nodes of a tree. In this example, I implemented three method which we use to traverse a tree.
- PreOrder Traversal
- InOrder Traversal
- PostOrder Traversal
PreOrder Traversal:
- Visit the root
- Traverse the left subtree
- Traverse the right subtree
InOrder Traversal:
- Traverse the left subtree
- Visit the root
- Traverse the right subtree
PostOrder Traversal:
- Traverse the left subtree
- Traverse the right subtree
- Visit the root
All source code is below.
Node Class:
class Node { public Node LeftNode { get; set; } public Node RightNode { get; set; } public int Data { get; set; } }
BinaryTree Class:
class BinaryTree { public Node Root { get; set; } public bool Add(int value) { Node before = null, after = this.Root; while (after != null) { before = after; if (value < after.Data) //Is new node in left tree? after = after.LeftNode; else if (value > after.Data) //Is new node in right tree? after = after.RightNode; else { //Exist same value return false; } } Node newNode = new Node(); newNode.Data = value; if (this.Root == null)//Tree ise empty this.Root = newNode; else { if (value < before.Data) before.LeftNode = newNode; else before.RightNode = newNode; } return true; } 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 value is same as parent's value, then this is the node to be deleted else { // node with only one child or no child if (parent.LeftNode == null) return parent.RightNode; else if (parent.RightNode == null) return parent.LeftNode; // node with two children: Get the inorder successor (smallest in the right subtree) parent.Data = MinValue(parent.RightNode); // Delete the inorder successor parent.RightNode = Remove(parent.RightNode, parent.Data); } return parent; } private int MinValue(Node node) { int minv = node.Data; while (node.LeftNode != null) { minv = node.LeftNode.Data; node = node.LeftNode; } return minv; } private Node Find(int value, Node parent) { if (parent != null) { if (value == parent.Data) return parent; if (value < parent.Data) return Find(value, parent.LeftNode); else return Find(value, parent.RightNode); } return null; } 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 void TraversePreOrder(Node parent) { if (parent != null) { Console.Write(parent.Data + " "); TraversePreOrder(parent.LeftNode); TraversePreOrder(parent.RightNode); } } public void TraverseInOrder(Node parent) { if (parent != null) { TraverseInOrder(parent.LeftNode); Console.Write(parent.Data + " "); TraverseInOrder(parent.RightNode); } } public void TraversePostOrder(Node parent) { if (parent != null) { TraversePostOrder(parent.LeftNode); TraversePostOrder(parent.RightNode); Console.Write(parent.Data + " "); } } }
Sample Application:
BinaryTree binaryTree = new BinaryTree(); binaryTree.Add(1); binaryTree.Add(2); binaryTree.Add(7); binaryTree.Add(3); binaryTree.Add(10); binaryTree.Add(5); binaryTree.Add(8); Node node = binaryTree.Find(5); int depth = binaryTree.GetTreeDepth(); Console.WriteLine("PreOrder Traversal:"); binaryTree.TraversePreOrder(binaryTree.Root); Console.WriteLine(); Console.WriteLine("InOrder Traversal:"); binaryTree.TraverseInOrder(binaryTree.Root); Console.WriteLine(); Console.WriteLine("PostOrder Traversal:"); binaryTree.TraversePostOrder(binaryTree.Root); Console.WriteLine(); binaryTree.Remove(7); binaryTree.Remove(8); Console.WriteLine("PreOrder Traversal After Removing Operation:"); binaryTree.TraversePreOrder(binaryTree.Root); Console.WriteLine(); Console.ReadLine();
See Also:
C# Binary Search Example