• Source
    1. // CPP program to print levels in sorted order.
    2. #include <iostream>
    3. #include <queue>
    4. #include <vector>
    5. using namespace std;
    6.  
    7. // A Binary Tree Node
    8. struct Node {
    9. int data;
    10. struct Node *left, *right;
    11. };
    12.  
    13. // Iterative method to find height of Binary Tree
    14. void printLevelOrder(Node* root)
    15. {
    16. // Base Case
    17. if (root == NULL)
    18. return;
    19.  
    20. // Create an empty queue for level order traversal
    21. queue<Node*> q;
    22.  
    23. // A priority queue (or min heap) of integers for
    24. // to store all elements of current level.
    25. priority_queue<int, vector<int>, greater<int> > current_level;
    26.  
    27. // A priority queue (or min heap) of integers for
    28. // to store all elements of next level.
    29. priority_queue<int, vector<int>, greater<int> > next_level;
    30.  
    31. // push the root for traverse all next level nodes
    32. q.push(root);
    33.  
    34. // for go level by level
    35. q.push(NULL);
    36.  
    37. // push the first node data in previous_level queue
    38. current_level.push(root->data);
    39.  
    40. while (q.empty() == false) {
    41.  
    42. // Get top of priority queue
    43. int data = current_level.top();
    44.  
    45. // Get top of queue
    46. Node* node = q.front();
    47.  
    48. // if node == NULL (Means this is boundary
    49. // between two levels), swap current_level
    50. // next_level priority queues.
    51. if (node == NULL) {
    52. q.pop();
    53.  
    54. // here queue is empty represent
    55. // no element in the actual
    56. // queue
    57. if (q.empty())
    58. break;
    59.  
    60. q.push(NULL);
    61. cout << "\n";
    62.  
    63. // swap next_level to current_level level
    64. // for print in sorted order
    65. current_level.swap(next_level);
    66.  
    67. continue;
    68. }
    69.  
    70. // print the current_level data
    71. cout << data << " ";
    72.  
    73. q.pop();
    74. current_level.pop();
    75.  
    76. /* Enqueue left child */
    77. if (node->left != NULL) {
    78. q.push(node->left);
    79.  
    80. // Enqueue left child in next_level queue
    81. next_level.push(node->left->data);
    82. }
    83.  
    84. /*Enqueue right child */
    85. if (node->right != NULL) {
    86. q.push(node->right);
    87.  
    88. // Enqueue right child in next_level queue
    89. next_level.push(node->right->data);
    90. }
    91. }
    92. }
    93.  
    94. // Utility function to create a new tree node
    95. Node* newNode(int data)
    96. {
    97. Node* temp = new Node;
    98. temp->data = data;
    99. temp->left = temp->right = NULL;
    100. return temp;
    101. }
    102.  
    103. // Driver program to test above functions
    104. int main()
    105. {
    106. // Let us create binary tree shown in above diagram
    107. Node* root = newNode(7);
    108. root->left = newNode(6);
    109. root->right = newNode(5);
    110. root->left->left = newNode(4);
    111. root->left->right = newNode(3);
    112. root->right->left = newNode(2);
    113. root->right->right = newNode(1);
    114.  
    115. /* 7
    116.   / \
    117.   6 5
    118.   / \ / \
    119.   4 3 2 1 */
    120.  
    121. cout << "Level Order traversal of binary tree is \n";
    122. printLevelOrder(root);
    123. return 0;
    124. }