We learned about the different type of traversals in this post
In pre-order traversal, each node is processed before (pre) either of its sub-trees. This is the simplest traversal to understand. However, even though each node is processed before the sub-trees, it still requires that some information must be maintained while moving down the tree. Let us consider an example
Pre-order traversal is defined as follows:
- Visit the root (Step 1)
- Traverse the left sub-tree in Pre-order (Step 2)
- Traverse the right sub-tree in Pre-order (Step 3)
With this definition, let us try to traverse the above tree –
So the final pre-order traversal will be 1, 2, 4, 5, 3, 6, 7
We can therefore write the recursive version of the traversal as:-
void preOrderRecursive(struct binaryTreeNode * root) { if(root) { // Visit the root (Step 1) printf("%d", root -> data); // Preorder traversal of left sub-tree (Step 2) preOrderRecursive(root -> left); // Preorder traversal of right sub-tree(Step 3) preOrderRecursive(root -> right); } }
Non-Recursive Preorder traversal
In recursive version a stack is required as we need to remember the current node so that after completing the left sub-tree we can go to right sub-tree. To simulate the same, first we process the current node and before going to left sub-tree, we store the current node on stack. After completing the left sub-tree processing, pop the element and go to its right sub-tree. Continue this process until stack is non-empty.
void preOrderNonRecursive(struct binaryTreeNode * root) { // Create a new stack struct stackNode * S = null; // We need to keep running the loop until stack is not empty while(1) { while(root) { // Process the current node (Step 1) printf("%d", root -> data); S = push(S, root -> data); // If left sub-tree exists, we need to add it to the stack. // So go to the left tree (Step 2) root = root -> left; } // If the stack is empty, that means all nodes have been traversed // we need to break if(isStackEmpty(S)) { break; } // If stack is not empty, we need to see the last element in the stack // So pop it root = top -> data; //Remove the element from stack S = S -> next; // Now go to the right sub-tree (Step 3) root = root -> right; } // We need to delete the stack free(S); }
Time Complexity:- O(n)
Space Complexity:- O(n)