// Java program to print inorder traversal without recursion and stack
/* A binary tree tNode has data, a pointer to left child and a pointer to right child */ classtNode{ int data; tNode left, right; tNode(int item) {data = item;left = right = null;} }
publicclassmarris_inorder{ tNode root; // Function to traverse a binary tree without recursion and without stack voidMorrisTraversal(tNode root){ tNode current, pre;
if (root == null) return;
current = root; while (current != null) { if (current.left == null) { System.out.print(current.data + " "); current = current.right; } else { /* Find the inorder predecessor of current */ pre = current.left; while (pre.right != null && pre.right != current) pre = pre.right;
/* Make current as right child of its inorder predecessor */ if (pre.right == null) { pre.right = current; current = current.left; } /* * Revert the changes made in the 'if' part to restore the original tree i.e., * fix the right child of predecessor */ else { pre.right = null; System.out.print(current.data + " "); current = current.right; } /* End of if condition pre->right == NULL */
} /* End of if condition current->left == NULL */
} /* End of while */ }
publicstaticvoidmain(String args[]){ /* Constructed binary tree is 1 / \ 2 3 / \ 4 5 */ marris_inorder tree = new marris_inorder(); tree.root = new tNode(1); tree.root.left = new tNode(2); tree.root.right = new tNode(3); tree.root.left.left = new tNode(4); tree.root.left.right = new tNode(5);