Inorder / PreOrder/PostOrder : T(C) = O(N), SC = O(N) — Recursive Solution
Morris Inorder Traversal is a tree traversal algorithm aiming to achieve a space complexity of O(1) without recursion or an external data structure.
Uses concept of threaded Binary tree by attaching current node with its inorder successor.
There are 3 cases:
vector<int> inorderTraversal(TreeNode* root) {
vector<int> result;
if(!root)
return result;
TreeNode * curr = root;
while(curr){
// case 1
if(!curr->left){
result.push_back(curr->val);
curr= curr->right;
}
//case 2 and 3
else if(curr->left) {
TreeNode* temp = curr->left;
while(temp->right && temp->right!=curr){
temp = temp->right;
}
//case 2
if(!temp->right) {
temp->right = curr;
curr= curr->left;
}
//case 3
else if(temp->right==curr){
temp->right=NULL;
result.push_back(curr->val);
curr= curr->right;
}
}
}
return result;
}
TC : 0(N), S(C) = O(1);
Slide variation in cases
vector<int> getPreOrderTraversal(TreeNode *root)
{
vector<int> result;
if(!root)
return result;
TreeNode * curr = root;
while(curr){
if(!curr->left){
result.push_back(curr->data);
curr= curr->right;
}
//case 2 and 3
else if(curr->left) {
TreeNode* temp = curr->left;
while(temp->right && temp->right!=curr){
temp = temp->right;
}
//case 2
if(!temp->right) {
result.push_back(curr->data);
temp->right = curr;
curr= curr->left;
}
//case 3
else if(temp->right==curr){
temp->right=NULL;
curr= curr->right;
}
}
}
return result;
}
Use queue and print first element at every level using level order traversal
vector<int> leftView(Node *root)
{
queue<Node*>q;
vector<int>res;
if(!root)
return res;
q.push(root);
while(!q.empty()){
int s = q.size();
for(int i=0;i<s;i++){
Node * node = q.front();
q.pop();
if(i==0){
res.push_back(node->data);
}
if(node->left){
q.push(node->left);
}
if(node->right){
q.push(node->right);
}
}
}
return res;
}