From bddd188a30a8220123b553452b5923a5bcda22b4 Mon Sep 17 00:00:00 2001 From: Enrique Hilst Date: Tue, 15 Sep 2020 16:13:41 -0500 Subject: [PATCH] breadth first traversal complete --- DataStructures.Tests/TreeTests.cs | 74 +++++++++++++++++++++++++++++- DataStructures/Trees/BinaryTree.cs | 28 +++++++++++ 2 files changed, 101 insertions(+), 1 deletion(-) diff --git a/DataStructures.Tests/TreeTests.cs b/DataStructures.Tests/TreeTests.cs index e1b6062..646768a 100644 --- a/DataStructures.Tests/TreeTests.cs +++ b/DataStructures.Tests/TreeTests.cs @@ -36,6 +36,10 @@ public void Add_can_add_single_Left_and_Right_nodes() tree.Add(2); tree.Add(7); + // ___6___ + // / \ + // 2 7 + //Assert Assert.Equal(6, tree.Root.Value); Assert.Equal(2, tree.Root.Left.Value); @@ -54,6 +58,13 @@ public void Contains_can_find_Node_value() tree.Add(10); tree.Add(1); + // ___6___ + // / \ + // 2 7 + // / \ \ + //1 3 10 + + // Act bool trueResult = tree.Contains(tree.Root, 10); bool falseResult = tree.Contains(tree.Root, 11); @@ -75,6 +86,12 @@ public void PreOrder_returns_values_as_strings() tree.Add(10); tree.Add(1); + // ___6___ + // / \ + // 2 7 + // / \ \ + //1 3 10 + StringBuilder sb = new StringBuilder(); // Act @@ -98,6 +115,14 @@ public void InOrder_returns_values_as_strings() tree.Add(9); tree.Add(20); + // ___6___ + // / \ + // 2 7 + // / \ / \ + //1 3 9 10 + // \ + // 20 + StringBuilder sb = new StringBuilder(); sb.Append(" "); @@ -123,6 +148,14 @@ public void PostOrder_returns_values_as_strings() tree.Add(9); tree.Add(20); + // ___6___ + // / \ + // 2 7 + // / \ / \ + //1 3 9 10 + // \ + // 20 + StringBuilder sb = new StringBuilder(); sb.Append(" "); @@ -148,14 +181,53 @@ public void FindFindMaxValue_returns_max_int() tree.Add(9); tree.Add(20); + // ___6___ + // / \ + // 2 7 + // / \ / \ + //1 3 9 10 + // \ + // 20 + // Act int result = tree.FindMaxValue(tree.Root); // Assert Assert.Equal(20, result); - } + [Fact] + public void Breadth_First_returns_tree_value_in_level_order() + { + // Arrange + BinaryTree tree = new BinaryTree(); + tree.Add(6); + tree.Add(2); + tree.Add(7); + tree.Add(3); + tree.Add(10); + tree.Add(1); + tree.Add(9); + tree.Add(20); + + // ___6___ + // / \ + // 2 7 + // / \ \ + //1 3 10 + // / \ + // 9 20 + + //Breadth_First list: 6, 2, 7, 1, 3, 10, 9, 20 + + // Act + IEnumerable result = tree.Breadth_First(); + + // Assert + int[] expected = new int[] { 6, 2, 7, 1, 3, 10, 9, 20 }; + Assert.Equal(expected, result); + + } } } diff --git a/DataStructures/Trees/BinaryTree.cs b/DataStructures/Trees/BinaryTree.cs index 47b638a..c79bafc 100644 --- a/DataStructures/Trees/BinaryTree.cs +++ b/DataStructures/Trees/BinaryTree.cs @@ -24,5 +24,33 @@ public int FindMaxValue(Node current) return result; } + + public IEnumerable Breadth_First() => Breadth_First_Helper(Root); + + + IEnumerable Breadth_First_Helper(Node current) + { + if (current == null) + yield break; + + Queue queue = new Queue(); + Queue queueResult = new Queue(); + + queue.Enqueue(current); + while (queue.Count > 0) + { + Node DequeuedNode = queue.Dequeue(); + queueResult.Enqueue(DequeuedNode); + + if (DequeuedNode.Left != null) + queue.Enqueue(DequeuedNode.Left); + + if (DequeuedNode.Right != null) + queue.Enqueue(DequeuedNode.Right); + } + + while (queueResult.Count > 0) + yield return queueResult.Dequeue().Value; + } } }