What is Morris traversal?
Morris (InOrder) Traversal is a tree traversal algorithm that does not use recursion or stacks. This traversal creates links as descendants and outputs nodes using those links. Finally, undo the changes to restore the original tree.
Given a binary tree, task is to do reverse inorder traversal using Morris Traversal.

Prerequisites :
In a binary tree with n nodes, there are n + 1 NULL pointers which waste memory. So, threaded binary trees makes use of these NULL pointers to save lots of Memory.
So, in Threaded Binary trees these NULL pointers will store some useful information.
- Ancestor information is stored only in left NULL pointers, called left branching binary trees.
- Storing successor information in NULL right pointers only, called as right threaded binary trees.
- Storing predecessor information in NULL left pointers and successor information in NULL right pointers, called as fully threaded binary trees or simply threaded binary trees.
Morris traversal can be used to do Inorder traversal, reverse Inorder traversal, Pre-order traversal with constant extra memory consumed O(1).
Reverse Morris Traversal : It is the inverse of Morris Traversal. In reverse morris traversal, we first create links to the inorder descendants of the current node, use those links to output data, and finally undo the changes to restore the original tree, then reverse inorder traversal to hold.
Algorithm :
1) Initialize Current as root.
2) While current is not NULL :
2.1) If current has no right child
a) Visit the current node.
b) Move to the left child of current.
2.2) Else, here we have 2 cases:
a) Find the inorder successor of current node.
Inorder successor is the left most node
in the right subtree or right child itself.
b) If the left child of the inorder successor is NULL:
1) Set current as the left child of its inorder successor.
2) Move current node to its right.
c) Else, if the threaded link between the current node
and it's inorder successor already exists :
1) Set left pointer of the inorder successor as NULL.
2) Visit Current node.
3) Move current to it's left child.
Implementation:
C++
#include<bits/stdc++.h>
using namespace std;
struct Node {
int data;
Node *left, *right;
};
Node *newNode( int data){
Node *temp = new Node;
temp->data = data;
temp->right = temp->left = NULL;
return temp;
}
void MorrisReverseInorder(Node *root)
{
if (!root)
return ;
Node *curr, *successor;
curr = root;
while (curr)
{
if (curr -> right == NULL)
{
cout << curr->data << " " ;
curr = curr->left;
}
else
{
successor = curr->right;
while (successor->left != NULL &&
successor->left != curr)
successor = successor->left;
if (successor->left == NULL)
{
successor->left = curr;
curr = curr->right;
}
else
{
successor->left = NULL;
cout << curr->data << " " ;
curr = curr->left;
}
}
}
}
int main()
{
Node *root = newNode(1);
root->left = newNode(2);
root->right = newNode(3);
root->left->left = newNode(4);
root->left->right = newNode(5);
root->right->left = newNode(6);
root->right->right = newNode(7);
MorrisReverseInorder(root);
return 0;
}
|
Java
class GFG
{
static class Node
{
int data;
Node left, right;
};
static Node newNode( int data)
{
Node temp = new Node();
temp.data = data;
temp.right = temp.left = null ;
return temp;
}
static void MorrisReverseInorder(Node root)
{
if (root == null )
return ;
Node curr, successor;
curr = root;
while (curr != null )
{
if (curr . right == null )
{
System.out.print( curr.data + " " );
curr = curr.left;
}
else
{
successor = curr.right;
while (successor.left != null &&
successor.left != curr)
successor = successor.left;
if (successor.left == null )
{
successor.left = curr;
curr = curr.right;
}
else
{
successor.left = null ;
System.out.print( curr.data + " " );
curr = curr.left;
}
}
}
}
public static void main(String args[])
{
Node root = newNode( 1 );
root.left = newNode( 2 );
root.right = newNode( 3 );
root.left.left = newNode( 4 );
root.left.right = newNode( 5 );
root.right.left = newNode( 6 );
root.right.right = newNode( 7 );
MorrisReverseInorder(root);
}
}
|
Python3
class newNode:
def __init__( self ,data):
self .data = data
self .left = self .right = None
def MorrisReverseInorder(root):
if ( not root) :
return
curr = root
successor = 0
while (curr):
if (curr.right = = None ) :
print (curr.data, end = " " )
curr = curr.left
else :
successor = curr.right
while (successor.left ! = None and
successor.left ! = curr):
successor = successor.left
if (successor.left = = None ) :
successor.left = curr
curr = curr.right
else :
successor.left = None
print (curr.data, end = " " )
curr = curr.left
if __name__ = = "__main__" :
root = newNode( 1 )
root.left = newNode( 2 )
root.right = newNode( 3 )
root.left.left = newNode( 4 )
root.left.right = newNode( 5 )
root.right.left = newNode( 6 )
root.right.right = newNode( 7 )
MorrisReverseInorder(root)
|
C#
using System;
class GFG
{
public class Node
{
public int data;
public Node left, right;
};
static Node newNode( int data)
{
Node temp = new Node();
temp.data = data;
temp.right = temp.left = null ;
return temp;
}
static void MorrisReverseInorder(Node root)
{
if (root == null )
return ;
Node curr, successor;
curr = root;
while (curr != null )
{
if (curr . right == null )
{
Console.Write( curr.data + " " );
curr = curr.left;
}
else
{
successor = curr.right;
while (successor.left != null &&
successor.left != curr)
successor = successor.left;
if (successor.left == null )
{
successor.left = curr;
curr = curr.right;
}
else
{
successor.left = null ;
Console.Write( curr.data + " " );
curr = curr.left;
}
}
}
}
public static void Main(String []args)
{
Node root = newNode(1);
root.left = newNode(2);
root.right = newNode(3);
root.left.left = newNode(4);
root.left.right = newNode(5);
root.right.left = newNode(6);
root.right.right = newNode(7);
MorrisReverseInorder(root);
}
}
|
Javascript
<script>
class Node
{
constructor()
{
this .data = 0;
this .left = null ;
this .right = null ;
}
};
function newNode(data)
{
var temp = new Node();
temp.data = data;
temp.right = temp.left = null ;
return temp;
}
function MorrisReverseInorder(root)
{
if (root == null )
return ;
var curr, successor;
curr = root;
while (curr != null )
{
if (curr . right == null )
{
document.write( curr.data + " " );
curr = curr.left;
}
else
{
successor = curr.right;
while (successor.left != null &&
successor.left != curr)
successor = successor.left;
if (successor.left == null )
{
successor.left = curr;
curr = curr.right;
}
else
{
successor.left = null ;
document.write( curr.data + " " );
curr = curr.left;
}
}
}
}
var root = newNode(1);
root.left = newNode(2);
root.right = newNode(3);
root.left.left = newNode(4);
root.left.right = newNode(5);
root.right.left = newNode(6);
root.right.right = newNode(7);
MorrisReverseInorder(root);
</script>
|
Time Complexity : O(n)
Auxiliary Space : O(1)