package com.interview.tree;
/**
* Date 03/08/2016
* @author Tushar Roy
*
* Morris inorder/preorder traversals
*
* Time complexity O(n)
* Space complexity O(1)
*/
public class MorrisTraversal {
public void inorder(Node root) {
Node current = root;
while(current != null) {
//left is null then print the node and go to right
if (current.left == null) {
System.out.print(current.data + " ");
current = current.right;
}
else {
//find the predecessor.
Node predecessor = current.left;
//To find predecessor keep going right till right node is not null or right node is not current.
while(predecessor.right != current && predecessor.right != null){
predecessor = predecessor.right;
}
//if right node is null then go left after establishing link from predecessor to current.
if(predecessor.right == null){
predecessor.right = current;
current = current.left;
}else{ //left is already visit. Go rigth after visiting current.
predecessor.right = null;
System.out.print(current.data + " ");
current = current.right;
}
}
}
}
public void preorder(Node root) {
Node current = root;
while (current != null) {
if(current.left == null) {
System.out.print(current.data + " ");
current = current.right;
}
else {
Node predecessor = current.left;
while(predecessor.right != current && predecessor.right != null) {
predecessor = predecessor.right;
}
if(predecessor.right == null){
predecessor.right = current;
System.out.print(current.data + " ");
current = current.left;
}else{
predecessor.right = null;
current = current.right;
}
}
}
}
public static void main(String args[]) {
BinaryTree bt = new BinaryTree();
Node root = null;
root = bt.addNode(10, root);
root = bt.addNode(50, root);
root = bt.addNode(-10, root);
root = bt.addNode(7, root);
root = bt.addNode(9, root);
root = bt.addNode(-20, root);
root = bt.addNode(30, root);
MorrisTraversal mt = new MorrisTraversal();
mt.inorder(root);
System.out.println();
mt.preorder(root);
}
}