×

String Coding Problems

Arrays Coding Problems

Sorting Coding Problems

Searching Coding Problems

Coding Algorithms

Tree Coding Problems

Stack Coding Problems

Linked list Coding Problems

Graph Coding Problems

Greedy Algorithms Coding Problems

Dynamic Programming Coding Problems

Matrix Coding Problems

Recursion Coding Problems

Number Theory Coding Problems

Backtracking Coding Problems

Heap Coding Problems

Brute Force Coding Problems

Implementation Coding Problems

Google Contests

Competitive Programming Coding

Miscellaneous

Reverse Level Order Traversal

In this article, we are going to see how to print reverse order traversal of a binary tree? This problem has been featured in coding round of Amazon, Adobe, FlipKart. Submitted by Radib Kar, on February 15, 2019

Problem statement

Write a program to print Reverse Level Order Traversal of a binary tree.

Example

Reverse Level Order Traversal
    Basic level order traversal:
    2
    7 5
    2 6 9
    5 11 4

    Reverse Level order traversal:
    5 11 4
    2 6 9
    7 5
    2

Solution

Of course the solution is quite like the level order traversal just a little bit of modification.

Algorithm

FUNCTION reverseLevelOrder (root): prints reverse Level order traversal of the tree

Prerequisite: Queue q, Stack s

FUNCTION reverseLevelOrder(root)// root of the tree
    1.  Declare a TreeNode type variable temp;                
    2.  Declare qto store nodes //creating a queue
    3.  Declare sfor reversal
    4.  IF (!root)   //root is null
        return;
	
    5.  EnQueue(q,root); // EnQueue the root in the queue
		
    6.  while(q is not empty){
            temp=DeQueue(q);  //Dequeue
            s.push(temp->data); //push temp->data to stack
            IF(temp->right)//this is different from ordinary level-order
                EnQueue(q,temp->right); // if right child exists EnQueue
            END IF
            IF(temp->left)
                EnQueue(q,temp->left); // if left child exists EnQueue
            END IF
        END While
    7.  While(s is not empty)
            Pop and print
        END While
    8.  DeleteQueue(q);
    9.  DeleteStack(s);

Explanation with example

Reverse Level Order Traversal

N.B: The nodes are represented by their respective values.

For the above example:

In the main we call reverseLevelOrder (2)
------------------------------------------------------------

reverseLevelOrder (2)
q.push(2)//EnQueue the root
------------------------------------------------------------

1st iteration:
q is not empty
temp= q.front()=2
q.pop()
Queue status:
Empty Queue
s.push(temp->data) //2
2->right not NULL
q.push(2->right) //q.push(5)
2->left not NULL
q.push(2->left)//q.push(7)
Queue status:
5 7
------------------------------------------------------------

2nd iteration:
q is not empty
temp= q.front()=5
q.pop()
Queue status:
7
s.push(temp->data) //5
5->right not NULL
q.push(5->right) //q.push(9)
5->leftNULL
Queue status:
7 9
------------------------------------------------------------

3rd iteration:
q is not empty
temp= q.front()=7
q.pop()
Queue status:
9
s.push(temp->data) //7
7->right not NULL
q.push(7->right) //q.push(6)
7->left not NULL
q.push(7->left) //q.push(2)
Queue status:
9 6 2
------------------------------------------------------------

4th iteration:
q is not empty
temp= q.front()=9
q.pop()
Queue status:
6 2
s.push(temp->data) //9
9->rightNULL
9->left not NULL
q.push(9->left) //q.push(4)
Queue status:
6 2 4
------------------------------------------------------------

5th iteration:
q is not empty
temp= q.front()=6
q.pop()
Queue status:
2 4
s.push(temp->data) //6
6->right not NULL
q.push(6->right) //q.push(11)
9->left not NULL
q.push(6->left) //q.push(5)
Queue status:
2 4 11 5
------------------------------------------------------------

6th iteration:
q is not empty
temp= q.front()=2
q.pop()
Queue status:
4 11 5
s.push(temp->data) //2
2->rightNULL
2->left  NULL
Queue status:
4 11 5
------------------------------------------------------------

7th iteration:
q is not empty
temp= q.front()=4
q.pop()
Queue status:
11 5
s.push(temp->data) //4
4->right NULL
4->left   NULL
Queue status:
11 5
------------------------------------------------------------

8th iteration:
q is not empty
temp= q.front()=11
q.pop()
Queue status:
5
s.push(temp->data) //11
11->right NULL
11->left   NULL
Queue status:
5
------------------------------------------------------------

9th iteration:
q is not empty
temp= q.front()=5
q.pop()
Queue status:
Empty queue
s.push(temp->data) //5
5->right NULL
5->left   NULL
Queue status:
Empty Queue
------------------------------------------------------------

10th iteration:
Empty Queue

Final stack status:
    5
    11
    4
    2
    6
    9
    7
    5
    2


Pop and print:
Output:
5 11 4 2 6 9 7 5 2


C++ Implementation

#include <bits/stdc++.h>
using namespace std;

class Node{    // tree node is defined
	public:
	int data;
	Node *left;
	Node *right;
};

void reverseLevelOrder(Node *root)
{
	Node* temp;
	stack<int> s;
	queue<Node*> q;
	q.push(root);
	while(!q.empty()){
		temp=q.front();
		q.pop();
		s.push(temp->data);
		if(temp->right) 
			q.push(temp->right);
		if(temp->left)
			q.push(temp->left);
	}
	while(!s.empty()){
		cout<<s.top()<<" ";
		s.pop();
	}
}

Node* newnode(int data)  // creating new node
{ 
	Node* node = (Node*)malloc(sizeof(Node)); 
	node->data = data; 
	node->left = NULL; 
	node->right = NULL; 
	return(node); 
} 


int main() { 
	//**same tree is builted as shown in example**
	Node *root=newnode(2); 
	root->left= newnode(7); 
	root->right= newnode(5); 
	root->right->right=newnode(9);
	root->right->right->left=newnode(4);
	root->left->left=newnode(2); 
	root->left->right=newnode(6);
	root->left->right->left=newnode(5);
	root->left->right->right=newnode(11);

	cout<<"Reverse Level Order traversal of binary tree is :"<<endl; 
	reverseLevelOrder(root); 

	return 0; 
}

Output

Reverse Level Order traversal of binary tree is :
5 11 4 2 6 9 7 5 2 


Comments and Discussions!

Load comments ↻





Copyright © 2024 www.includehelp.com. All rights reserved.