Print Binary Tree levels in sorted order

Given a Binary tree, the task is to print its all level in sorted order

Examples:

Input :     7
          /    \
        6       5
       / \     / \
      4  3    2   1
Output : 
7
5 6
1 2 3 4 

Input :     7
          /    \
        16       1
       / \      
      4   13    
Output :
7 
1 16
4 13

Here we can use two Priority queue for print in sorted order. We create an empty queue q and two priority queues, current_level and next_level. We use NULL as a separator between two levels. Whenever we encounter NULL in normal level order traversal, we swap current_level and next_level.

filter_none

edit
close

play_arrow

link
brightness_4
code

// CPP program to print levels in sorted order.
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
  
// A Binary Tree Node
struct Node {
    int data;
    struct Node *left, *right;
};
  
// Iterative method to find height of Binary Tree
void printLevelOrder(Node* root)
{
    // Base Case
    if (root == NULL)
        return;
  
    // Create an empty queue for level order traversal
    queue<Node*> q;
  
    // A priority queue (or min heap) of integers for 
    // to store all elements of current level. 
    priority_queue<int, vector<int>, greater<int> > current_level;
  
    // A priority queue (or min heap) of integers for 
    // to store all elements of next level. 
    priority_queue<int, vector<int>, greater<int> > next_level;
  
    // push the root for traverse all next level nodes
    q.push(root);
  
    // for go level by level
    q.push(NULL);
  
    // push the first node data in previous_level queue
    current_level.push(root->data);
  
    while (q.empty() == false) {
  
        // Get top of priority queue 
        int data = current_level.top();
  
        // Get top of queue
        Node* node = q.front();
  
        // if node == NULL (Means this is boundary
        // between two levels), swap current_level
        // next_level priority queues.
        if (node == NULL) {
            q.pop();
  
            // here queue is empty represent
            // no element in the actual
            // queue
            if (q.empty())
                break;
  
            q.push(NULL);
            cout << "\n";
  
            // swap next_level to current_level level
            // for print in sorted order
            current_level.swap(next_level);
  
            continue;
        }
  
        // print the current_level data
        cout << data << " ";
  
        q.pop();
        current_level.pop();
  
        /* Enqueue left child */
        if (node->left != NULL) {
            q.push(node->left);
  
            // Enqueue left child in next_level queue
            next_level.push(node->left->data);
        }
  
        /*Enqueue right child */
        if (node->right != NULL) {
            q.push(node->right);
  
            // Enqueue right child in next_level queue
            next_level.push(node->right->data);
        }
    }
}
  
// Utility function to create a new tree node
Node* newNode(int data)
{
    Node* temp = new Node;
    temp->data = data;
    temp->left = temp->right = NULL;
    return temp;
}
  
// Driver program to test above functions
int main()
{
    // Let us create binary tree shown in above diagram
    Node* root = newNode(7);
    root->left = newNode(6);
    root->right = newNode(5);
    root->left->left = newNode(4);
    root->left->right = newNode(3);
    root->right->left = newNode(2);
    root->right->right = newNode(1);
  
    /*     7
         /    \
        6       5
       / \     / \
      4  3     2  1          */
  
    cout << "Level Order traversal of binary tree is \n";
    printLevelOrder(root);
    return 0;
}

chevron_right


Output:

Level Order traversal of binary tree is 
7 
5 6 
1 2 3 4


My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.