Skip to content

Commit aa1eb7b

Browse files
authored
Morris Traversal div-bargali#141
Morris Traversal div-bargali#141
2 parents a502e2d + 56cfae2 commit aa1eb7b

File tree

2 files changed

+210
-0
lines changed

2 files changed

+210
-0
lines changed
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
// C++ program for Morris Inorder traversal
2+
//Inorder Traversal :left, root, right
3+
4+
#include<iostream>
5+
#include <bits/stdc++.h>
6+
using namespace std;
7+
8+
//A tree node has data, left and right pointers
9+
class node
10+
{
11+
public:
12+
int data;
13+
node *left;
14+
node *right;
15+
};
16+
17+
// Function to create a new tree node
18+
node* newNode(int data)
19+
{
20+
node* newnode = new node();
21+
newnode->data = data;
22+
newnode->left = NULL;
23+
newnode->right = NULL;
24+
return newnode;
25+
}
26+
27+
// Function for recursive inorder traversal
28+
void inorder(node* root)
29+
{
30+
if(!root)
31+
return ;
32+
33+
inorder(root->left);
34+
cout<<root->data<<" ";
35+
inorder(root->right);
36+
37+
}
38+
39+
// Preorder traversal without using recursion and without using stack
40+
void morrisTraversalInorder(node* root)
41+
{
42+
if (!root)
43+
return;
44+
45+
node *cur ;
46+
47+
while (root != NULL) {
48+
49+
// If left child is null, print the current node data and move to right child.
50+
if (root->left == NULL) {
51+
cout<<root->data<<" ";
52+
root = root->right;
53+
}
54+
else {
55+
56+
// Find the inorder predecessor
57+
cur = root->left;
58+
while (cur->right != NULL && cur->right != root)
59+
cur = cur->right;
60+
61+
// Make cur as the right child of its inorder predecessor
62+
if (cur->right == NULL) {
63+
cur->right = root;
64+
root = root->left;
65+
}
66+
67+
// If the right child of inorder predecessor already points to this node make it null, print the value and move root
68+
else {
69+
cur->right = NULL;
70+
cout<<root->data<<" " ;
71+
root = root->right;
72+
}
73+
}
74+
}
75+
76+
}
77+
78+
79+
//Driver program
80+
int main()
81+
{
82+
node* root = NULL;
83+
84+
root = newNode(2);
85+
root->left = newNode(4);
86+
root->right = newNode(6);
87+
88+
root->left->left = newNode(8);
89+
root->left->right = newNode(10);
90+
91+
root->right->left = newNode(12);
92+
root->right->right = newNode(14);
93+
94+
root->left->left->left = newNode(16);
95+
root->left->left->right = newNode(18);
96+
97+
cout<<"Morris Traversal (Inorder) \n";
98+
morrisTraversalInorder(root);
99+
cout<<"\n\n";
100+
101+
cout<<"Recursive Inorder Rraversal \n";
102+
inorder(root);
103+
104+
return 0;
105+
}
106+
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
// C++ program for Morris Preorder traversal
2+
//Preorder Traversal : Root, left, right
3+
4+
#include<iostream>
5+
#include <bits/stdc++.h>
6+
using namespace std;
7+
8+
//A tree node has data, left and right pointers
9+
class node
10+
{
11+
public:
12+
int data;
13+
node *left;
14+
node *right;
15+
};
16+
17+
//function to create a new tree node
18+
node* newNode(int data)
19+
{
20+
node* newnode = new node();
21+
newnode->data = data;
22+
newnode->left = NULL;
23+
newnode->right = NULL;
24+
return newnode;
25+
}
26+
27+
// Function for recursive preorder traversal
28+
void preorder(node* root)
29+
{
30+
if(!root)
31+
return ;
32+
33+
cout<<root->data<<" ";
34+
preorder(root->left);
35+
preorder(root->right);
36+
37+
}
38+
39+
// Preorder traversal without using recursion and without using stack
40+
void morrisTraversalPreorder(node* root)
41+
{
42+
//while root is not NULL
43+
while (root)
44+
{
45+
// If left child is null, print the current node data and move to right child.
46+
if (root->left == NULL)
47+
{
48+
cout<<root->data<<" ";
49+
root = root->right;
50+
}
51+
else
52+
{
53+
// Find inorder predecessor
54+
node* cur = root->left;
55+
while (cur->right && cur->right != root)
56+
cur = cur->right;
57+
58+
// If the right child of inorder predecessor already points to this node make it null and move root
59+
if (cur->right == root)
60+
{
61+
cur->right = NULL;
62+
root = root->right;
63+
}
64+
65+
// If right child doesn't point to this node, then print this node and make right child point to this node
66+
else
67+
{
68+
cout<<root->data<<" ";
69+
cur->right = root;
70+
root = root->left;
71+
}
72+
}
73+
}
74+
}
75+
76+
77+
//Driver program
78+
int main()
79+
{
80+
node* root = NULL;
81+
82+
root = newNode(2);
83+
root->left = newNode(4);
84+
root->right = newNode(6);
85+
86+
root->left->left = newNode(8);
87+
root->left->right = newNode(10);
88+
89+
root->right->left = newNode(12);
90+
root->right->right = newNode(14);
91+
92+
root->left->left->left = newNode(16);
93+
root->left->left->right = newNode(18);
94+
95+
cout<<"Morris Traversal (Preorder) \n";
96+
morrisTraversalPreorder(root);
97+
cout<<"\n\n";
98+
99+
cout<<"Recursive Preorder Rraversal \n";
100+
preorder(root);
101+
102+
return 0;
103+
}
104+

0 commit comments

Comments
 (0)