/// <summary> /// Recursively Visits All nodes in tree applying a given action to all nodes. /// By default this method traverses the tree in inorder fashion. /// </summary> public static void ForEach <T>(BSTNode <T> BinaryTreeRoot, Action <T> Action, TraversalMode Mode = TraversalMode.InOrder) where T : IComparable <T> { if (BinaryTreeRoot == null) { throw new ArgumentNullException("Tree root cannot be null."); } if (Action == null) { throw new ArgumentNullException("Action<T> Action cannot be null."); } // Traverse switch (Mode) { case TraversalMode.PreOrder: BinaryTreeRecursiveWalker.PreOrderVisitor(BinaryTreeRoot, Action); return; case TraversalMode.InOrder: BinaryTreeRecursiveWalker.InOrderVisitor(BinaryTreeRoot, Action); return; case TraversalMode.PostOrder: BinaryTreeRecursiveWalker.PostOrderVisitor(BinaryTreeRoot, Action); return; default: BinaryTreeRecursiveWalker.InOrderVisitor(BinaryTreeRoot, Action); return; } }
/************************************************************************************ * PRIVATE HELPERS SECTION * */ /// <summary> /// Private helper method for Preorder Traversal. /// </summary> private static void PreOrderVisitor <T>(BSTNode <T> BinaryTreeRoot, Action <T> Action) where T : IComparable <T> { if (BinaryTreeRoot == null) { return; } Action(BinaryTreeRoot.Value); BinaryTreeRecursiveWalker.PreOrderVisitor <T>(BinaryTreeRoot.LeftChild, Action); BinaryTreeRecursiveWalker.PreOrderVisitor <T>(BinaryTreeRoot.RightChild, Action); }