/// <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; } }
/// <summary> /// Private helper method for Preorder Traversal. /// </summary> private static void PostOrderVisitor <T>(BSTNode <T> BinaryTreeRoot, Action <T> Action) where T : IComparable <T> { if (BinaryTreeRoot == null) { return; } BinaryTreeRecursiveWalker.PostOrderVisitor <T>(BinaryTreeRoot.LeftChild, Action); BinaryTreeRecursiveWalker.PostOrderVisitor <T>(BinaryTreeRoot.RightChild, Action); Action(BinaryTreeRoot.Value); }