From 62834c14322fd42d27e381be8951b9c0ae61afde Mon Sep 17 00:00:00 2001 From: Shruti Sheoran Date: Thu, 11 Oct 2018 11:54:29 +0530 Subject: [PATCH] Add Morris Inorder Algorithm (Binary Tree) --- Datastructures/MorrisInorder.cpp | 94 ++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 Datastructures/MorrisInorder.cpp diff --git a/Datastructures/MorrisInorder.cpp b/Datastructures/MorrisInorder.cpp new file mode 100644 index 000000000..5ea630fac --- /dev/null +++ b/Datastructures/MorrisInorder.cpp @@ -0,0 +1,94 @@ +#include +#include + +/************************** + @author shrutisheoran +**************************/ + +using namespace std; + +struct Btree { + int data; + struct Btree* left; //Pointer to left subtree + struct Btree* right; //Pointer to right subtree +}; + +void insert(Btree **root, int d) { + Btree *nn = new Btree(); //Creating new node + nn->data = d; + nn->left = NULL; + nn->right = NULL; + if(*root == NULL) { + *root = nn; + return; + } + else { + queue q; + // Adding root node to queue + q.push(*root); + while(!q.empty()) { + Btree *node = q.front(); + // Removing parent node from queue + q.pop(); + if(node->left) + // Adding left child of removed node to queue + q.push(node->left); + else { + // Adding new node if no left child is present + node->left = nn; + return; + } + if(node->right) + // Adding right child of removed node to queue + q.push(node->right); + else { + // Adding new node if no right child is present + node->right = nn; + return; + } + } + } +} + +void morrisInorder(Btree *root) { + Btree *curr = root; + Btree *temp; + while(curr) { + if(curr->left==NULL) { + cout<data<<" "; + // If left of current node is NULL then curr is shifted to right + curr = curr->right; + } + else { + // Left of current node is stored in temp + temp = curr->left; + // Moving to extreme right of temp + while(temp->right&&temp->right!=curr) + temp = temp->right; + // If extreme right is null it is made to point to currrent node (will be used for backtracking) + if(temp->right == NULL) { + temp->right = curr; + // current node is made to point its left subtree + curr = curr->left; + } + // If extreme right already points to currrent node it it set to null + else if(temp->right == curr) { + cout<data<<" "; + temp->right = NULL; + // current node is made to point its right subtree + curr = curr->right; + } + } + } +} + +int main() { + // Testing morrisInorder funtion + Btree *root = NULL; + int i; + for(i = 1 ; i <= 7 ; i++) + insert(&root, i); + cout<<"Morris Inorder: "; + morrisInorder(root); + return 0; +}