We have discussed Thread based Morris Traversal. Can we do inorder traversal without threads if we have parent pointers available to us?
Input: Root of Below Tree [Every node of tree has parent pointer also] 10 / \ 5 100 / \ 80 120 Output: 5 10 80 100 120 The code should not extra space (No Recursion and stack)
In inorder traversal, we follow “left root right”. We can move to children using left and right pointers. Once a node is visited, we need to move to parent also. For example, in the above tree, we need to move to 10 after printing 5. For this purpose, we use parent pointer. Below is algorithm.
1. Initialize current node as root 2. Initialize a flag: leftdone = false; 3. Do following while root is not NULL a) If leftdone is false, set current node as leftmost child of node. b) Mark leftdone as true and print current node. c) If right child of current nodes exists, set current as right child and set leftdone as false. d) Else If parent exists, If current node is left child of its parent, set current node as parent. If current node is right child, keep moving to ancestors using parent pointer while current node is right child of its parent. e) Else break (We have reached back to root)
Let us consider below tree for illustration. 10 / \ 5 100 / \ 80 120 Initialize: Current node = 10, leftdone = false Since leftdone is false, we move to 5 (3.a), print it and set leftdone = true. Now we move to parent of 5 (3.d). Node 10 is printed because leftdone is true. We move to right of 10 and set leftdone as false (3.c) Now current node is 100. Since leftdone is false, we move to 80 (3.a) and set leftdone as true. We print current node 80 and move back to parent 100 (3.d). Since leftdone is true, we print current node 100. Right of 100 exists, so we move to 120 (3.c). We print current node 120. Since 120 is right child of its parent we keep moving to parent while parent is right child of its parent. We reach root. So we break the loop and stop
Below is the implementation of above algorithm. Note that the implementation uses Binary Search Tree instead of Binary Tree. We can use the same function inorder() for Binary Tree also. The reason for using Binary Search Tree in below code is, it is easy to construct a Binary Search Tree with parent pointers and easy to test the outcome (In BST inorder traversal is always sorted).
Inorder traversal is 2 3 4 6 10 13 14 22 24 27 29 34
This article is contributed by Rishi Chhibber. Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above
Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.
- Inorder Tree Traversal without recursion and without stack!
- Postorder traversal of Binary Tree without recursion and without stack
- Inorder Tree Traversal without Recursion
- Check if Inorder traversal of a Binary Tree is palindrome or not
- Construct Special Binary Tree from given Inorder traversal
- Calculate height of Binary Tree using Inorder and Level Order Traversal
- Zig-Zag traversal of a Binary Tree using Recursion
- Find maximum and minimum element in binary tree without using recursion or stack or queue
- Cartesian tree from inorder traversal | Segment Tree
- Inorder traversal of an N-ary Tree
- Find all possible binary trees with given Inorder Traversal
- DFS traversal of a tree using recursion
- Preorder Traversal of N-ary Tree Without Recursion
- Level order traversal of Binary Tree using Morris Traversal
- Check if a binary tree is subtree of another binary tree using preorder traversal : Iterative
- Construct Full Binary Tree using its Preorder traversal and Preorder traversal of its mirror tree
- Inorder Successor of a node in Binary Tree
- Construct a Binary Tree from Postorder and Inorder
- Print K inorder successors of a Binary Tree in O(1) space
- Sum of the mirror image nodes of a complete binary tree in an inorder way