diff --git a/C#/Datastructures/BinaryTree/Tree.cs b/C#/Datastructures/BinaryTree/Tree.cs index 527aca6..5219063 100644 --- a/C#/Datastructures/BinaryTree/Tree.cs +++ b/C#/Datastructures/BinaryTree/Tree.cs @@ -1,5 +1,6 @@ -using C_.Datastructures.Stack; using C_.Datastructures.LinkedList; +using C_.Datastructures.Stack; +using C_.Datastructures.Queue; using System; namespace C_.Datastructures.BinaryTree @@ -116,31 +117,86 @@ namespace C_.Datastructures.BinaryTree return true; } - public LinkedList? Inorder() - {// - if (Count == 0) + public LinkedList? Traverse(TraversalType traversalType) + { + if (Root == default) return default; LinkedList list = LinkedList.Create(); - Inorder(list, Root!); + switch (traversalType) + {//Select which type of traversal to do + case TraversalType.Inorder: + Inorder(list, Root); + break; + case TraversalType.Preorder: + Preorder(list, Root); + break; + case TraversalType.Postorder: + Postorder(list, Root); + break; + case TraversalType.Breadth: + Queue> queue = Queue>.Create(); + BreadthFirst(list, queue, Root); + break; + default: + return default; + } + return list; } private void Inorder(LinkedList list, TreeNode node) - { + {//Inorder Traversal if (node.Left != default) Inorder(list, node.Left); - list.Append(node.Value!); + list.Append(node.Value); if (node.Right != default) Inorder(list, node.Right); } + private void Preorder(LinkedList list, TreeNode node) + {//Preorder Traversal + list.Append(node.Value); + + if (node.Left != default) + Preorder(list, node.Left); + + if (node.Right != default) + Preorder(list, node.Right); + } + + private void Postorder(LinkedList list, TreeNode node) + {//Postorder Traversal + if (node.Left != default) + Postorder(list, node.Left); + + if (node.Right != default) + Postorder(list, node.Right); + + list.Append(node.Value); + } + + private void BreadthFirst(LinkedList list, Queue> queue, TreeNode node) + {//Breadth First Traversal + list.Append(node.Value); + + if (node.Left != default) + queue.Push(node.Left); + + if (node.Right != default) + queue.Push(node.Right); + + //Only continue to traverse if there are no mode nodes to process + if (queue.Peek() != default) + BreadthFirst(list, queue, queue.Pop()!); + } - private TreeNode? Traverse(T value, TreeNode? node) + + private TreeNode? GetNext(T value, TreeNode? node) {//T is comparable so use methods to determine which way to traverse if(node == default) return default; @@ -168,7 +224,7 @@ namespace C_.Datastructures.BinaryTree if (stack.Peek()!.Value!.Equals(value)) return stack; - stack.Push(Traverse(value, stack.Peek())); + stack.Push(GetNext(value, stack.Peek())); } return default; } @@ -213,7 +269,7 @@ namespace C_.Datastructures.BinaryTree TreeNode? node; - node = Descend(value, Traverse(value, current)); + node = Descend(value, GetNext(value, current)); if (node == null) { return current; @@ -221,4 +277,12 @@ namespace C_.Datastructures.BinaryTree return node; } } + + public enum TraversalType + {//Enum to allow for Traversal selection + Inorder, + Preorder, + Postorder, + Breadth + } } \ No newline at end of file diff --git a/C#/Program.cs b/C#/Program.cs index 0582bce..dbce0c0 100644 --- a/C#/Program.cs +++ b/C#/Program.cs @@ -112,20 +112,27 @@ Console.WriteLine("Hello, World!"); Tree tree = new Tree(); -tree.Add(10); -tree.Add(8); -tree.Add(6); -tree.Add(3); -tree.Add(4); -tree.Add(5); -tree.Add(2); -tree.Add(0); +tree.Add(40); +tree.Add(30); +tree.Add(50); +tree.Add(25); +tree.Add(35); +tree.Add(45); +tree.Add(60); +tree.Add(15); +tree.Add(28); +tree.Add(55); +tree.Add(70); -var x = tree.Delete(10); +//var x = tree.Delete(10); //tree.Delete(5); -var l = tree.Inorder(null); +var inorder = tree.Traverse(TraversalType.Inorder); +var preorder = tree.Traverse(TraversalType.Preorder); +var postorder = tree.Traverse(TraversalType.Postorder); +var breadthFirst = tree.Traverse(TraversalType.Breadth); + Console.ReadLine();