Pages

Search This Blog

December 19, 2012

Level and Spiral Order Traversal in CPP

#include <iostream>
#include <iomanip>
#include <queue>
#include <deque>
#include <conio.h>
/*
Print the level order of binary tree such that each level should print in a different line

- start from the root
- enqueue the node of that level
- dequeue till queue is empty
- add a new line
- continue
*/

struct Node
{
    Node(int x):data(x), left(0), right(0){}
    int data;
    Node* left, *right;
};

std::queue<Node *> queue;

Node* root = 0;

void levelOrderTraversal()
{
    queue.push(root);
    
    while(true)
    {
        std::queue<Node *> aux;
        while(!queue.empty())
        {
            Node* tmp = queue.front();
            std::cout << tmp->data << " ";
            if(tmp->left != NULL) aux.push(tmp->left);
            if(tmp->right != NULL) aux.push(tmp->right);            
            queue.pop();
        }
        std::cout << std::endl;
        queue = aux;
        
        if(queue.empty()) break; // end
    }
}

void spiralOrderTraversal()
{
    queue.push(root);
    
    int rotate = 0;
    while(true)
    {
        std::queue<Node *> aux;
        std::deque<Node *> disp; // double ended queue
        while(!queue.empty())
        {
            disp.push_back(queue.front());
            Node* tmp = queue.front();
            if(tmp->left != NULL) aux.push(tmp->left);
            if(tmp->right != NULL) aux.push(tmp->right);            
            queue.pop();
        }
        queue = aux;

        // display the contents of display queue
        while(!disp.empty())
        {
            if(rotate)
            {
                std::cout << disp.back()->data << " ";
                disp.pop_back();
            }
            else
            {
                std::cout << disp.front()->data << " ";            
                disp.pop_front();
            }
        }
        std::cout << std::endl;
        
        rotate = ~rotate; // change the direction        
        if(queue.empty()) break; // end
    }
}

int main()
{
    root = new Node(3);
    root->left = new Node(5);
    root->right = new Node(2);
    root->left->left = new Node(7);
    root->left->right = new Node(4);
    root->right->left = new Node(1);
    root->right->right = new Node(9);
    root->left->left->left = new Node(34);
    root->left->left->right = new Node(63);
    root->right->left->left = new Node(12);
    root->right->left->right = new Node(14);
    
    levelOrderTraversal();
    
    spiralOrderTraversal();
    
    getch();
}

No comments:

Post a Comment