forked from mrigaankzoro/Hacktoberfest24
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Morris_Traversal_Preorder.cpp
49 lines (45 loc) · 1.64 KB
/
Morris_Traversal_Preorder.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
/*Time Complexity: O(2N) where N is the number of nodes in the Binary Tree.
The time complexity is linear, as each node is visited at most
twice (once for establishing the temporary link and once for reverting it).
Space Complexity : O(1) No additional space is used hence maintaining a space complexity of O(1).
*/
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
vector<int> preorder ;
TreeNode* cur=root;
while(cur!=NULL){
if(cur->left ==NULL) {
preorder.push_back(cur->val);
cur = cur->right ;
}
else{
TreeNode* prev= cur->left;
while(prev->right && prev->right!=cur){
prev= prev->right;
}
if(prev->right == NULL) {
prev->right = cur; //make temporary link to root node from leftmost node of left subtree
preorder.push_back(cur->val);
cur= cur->left;
}
if(prev->right == cur){
prev->right = NULL; //remove temporary link to root node
cur = cur->right;
}
}
}
return preorder;
}
};