Posted on by Kalkicode
Code Binary Tree

Level order traversal with direction change of given intervals

Here given code implementation process.

/*
    C Program 
    Level order traversal with direction change of given intervals
*/
#include <stdio.h>
#include <stdlib.h>

//Binary Tree node
struct Node
{
    int data;
    struct Node *left, *right;
};
// Define Queue Node
struct MyQueue
{
    int level;
    struct Node *element;
    struct MyQueue *next;
};
// Define Stack Node
struct MyStack
{
    int element;
    struct MyStack *next;
};

//This is creating a binary tree node and return this
struct Node *get_node(int data)
{
    // Create dynamic node
    struct Node *new_node = (struct Node *) malloc(sizeof(struct Node));
    if (new_node != NULL)
    {
        //Set data and pointer values
        new_node->data = data;
        new_node->left = NULL;
        new_node->right = NULL;
    }
    else
    {
        //This is indicates, segmentation fault or memory overflow problem
        printf("Memory Overflow\n");
    }
    //return new node
    return new_node;
}
//Create a queue node and returns this node
struct MyQueue *enqueue(struct Node *tree_node)
{
    //Make a new Queue node
    struct MyQueue *new_node = (struct MyQueue *) malloc(sizeof(struct MyQueue));
    if (new_node != NULL)
    {
        //Set node values
        new_node->element = tree_node;
        new_node->next = NULL;
    }
    else
    {
        printf("Memory Overflow\n");
    }
    return new_node;
}
//Remove a queue elements
void dequeue(struct MyQueue **front)
{
    if ( *front != NULL)
    {
        struct MyQueue *remove = *front;
        //Visit to next node
        *front = remove->next;
        remove->element = NULL;
        remove->next = NULL;
        //free node
        free(remove);
        remove = NULL;
    }
}
//Add node at top of stack
void push(struct MyStack **top, int data)
{
    //Make a new node
    struct MyStack *new_node = (struct MyStack *) malloc(sizeof(struct MyStack));
    if (new_node != NULL)
    {
        //Set node values
        new_node->element = data;
        new_node->next = *top;*top = new_node;
    }
    else
    {
        printf("Memory Overflow\n");
    }
}
// Remove top element
void pop(struct MyStack **top)
{
    if ( *top != NULL)
    {
        struct MyStack *temp = *top;*top = temp->next;
        free(temp);
        temp = NULL;
    }
}
//Print stack elements
void print_stack(struct MyStack **top)
{
    struct MyStack *temp = *top;
    while (temp != NULL)
    {
        printf("  %d", temp->element);
        temp = temp->next;
        pop(top);
    }
}

// Print binary tree level using change direction of given intervals
void print_interval(struct Node *root, int interval)
{
    if (root == NULL)
    {
        printf("\n Empty Tree \n");
    }
    else if (interval <= 0)
    {
        printf("\n Invalid Interval");
    }
    else
    {

        printf("\n Direction Interval : %d",interval);
        // Declare queue pointers
        struct MyQueue *front = NULL, *tail = NULL;
        struct MyQueue *temp = NULL;
        // Declare stack pointer
        struct MyStack *top = NULL;
        //make a tree pointer
        struct Node *node = NULL;
        //Get first node of tree
        front = enqueue(root);
        //Start level of first node is one
        front->level = 1;
        //Set tail node to first node
        tail = front;
        // Start to first node
        temp = front;
        // Useful auxiliary variables
        int level = 0;
        int counter = 0;

        // Get level elements into a queue
        while (temp != NULL)
        {
            //Tree node
            node = temp->element;
            //Get node level
            level = temp->level + 1;
            if (node->left != NULL)
            {
                //Add new left child node
                tail->next = enqueue(node->left);
                tail->next->level = level;
                tail = tail->next;
            }
            if (node->right != NULL)
            {
                //Add new right child node
                tail->next = enqueue(node->right);
                tail->next->level = level;
                tail = tail->next;
            }
            //Visit to next node queue
            temp = temp->next;
        }

        // Change the direction in the given interval and print the tree nodes
        while (front != NULL)
        {

            level = (interval - 1) + front->level;

            //Useful to find new levels in tree 
            counter = front->level - 1;

            //print n level
            while (front != NULL && front->level <= level)
            {
                if (front->level != counter)
                {
                    //switch level
                    printf("\n");
                    counter = front->level;
                }
                printf("  %d", front->element->data);
                //remove  a queue node
                dequeue( &front);
            }

            if (front != NULL)
            {

                level = (interval - 1) + front->level;
                counter = front->level;
            }
            // Add interval into stack
            while (front != NULL && front->level <= level)
            {
                if (front->level != counter)
                {
                    //Switch level
                    printf("\n");
                    counter = front->level;
                    print_stack(&top);
                }
                push( &top, front->element->data);
                //remove  a queue node
                dequeue( &front);
            }
            if (top != NULL)
            {
                printf("\n");
                print_stack(&top);
            }
        }

        printf("\n");
    }
}
int main()
{
    struct Node *root = NULL;
    /*
             8  
            / \ 
           /   \                        
          /     \    
         5       10    
        / \     /  \               
       1   3   11   2  
      /     \   \    \
     6       9   4   12
            /     \    \ 
           15      13   17
          /  \     / 
        20   31   32
        -----------------
        Construct binary tree
    */
    root = get_node(8);
    root->left = get_node(5);
    root->left->right = get_node(3);
    root->left->right->right = get_node(9);
    root->left->right->right->left = get_node(15);
    root->left->right->right->left->left = get_node(20);
    root->left->right->right->left->right = get_node(31);
    root->left->left = get_node(1);
    root->left->left->left = get_node(6);
    root->right = get_node(10);
    root->right->left = get_node(11);
    root->right->left->right = get_node(4);
    root->right->left->right->right = get_node(13);
    root->right->left->right->right->left = get_node(32);
    root->right->right = get_node(2);
    root->right->right->right = get_node(12);
    root->right->right->right->right = get_node(17);

    //Test Cases
    print_interval(root, 2);
    print_interval(root, 1);
    print_interval(root, 3);
    return 0;
}

Output

 Direction Interval : 2
  8
  5  10
  2  11  3  1
  12  4  9  6
  15  13  17
  20  31  32

 Direction Interval : 1
  8
  10  5
  1  3  11  2
  12  4  9  6
  15  13  17
  32  31  20

 Direction Interval : 3
  8
  5  10
  1  3  11  2
  12  4  9  6
  17  13  15
  32  31  20
/*
    Java Program 
    Level order traversal with direction change of given intervals
*/
// Binary Tree node
class TreeNode
{
	public int data;
	public TreeNode left;
	public TreeNode right;
	public TreeNode(int data)
	{
		// Set node value
		this.data = data;
		this.left = null;
		this.right = null;
	}
}
//Stack Node
class StackNode
{
	public int data;
	public StackNode next;
	public StackNode(int data)
	{
		this.data = data;
		this.next = null;
	}
}
// Queue Node
class QueueNode
{
	public TreeNode element;
	public QueueNode next;
	public int level;
	public QueueNode(TreeNode element, int level)
	{
		this.element = element;
		this.next = null;
		this.level = level;
	}
}
//Define custom queue class
class MyQueue
{
	public QueueNode front;
	public QueueNode tail;
	public MyQueue()
	{
		this.front = null;
		this.tail = null;
	}
	//Add a new node at last of queue
	public void enqueue(TreeNode element, int level)
	{
		QueueNode new_node = new QueueNode(element, level);
		if (this.front == null)
		{
			//When first node of queue
			this.front = new_node;
		}
		else
		{
			//Add node at last position
			this.tail.next = new_node;
		}
		this.tail = new_node;
	}
	//Delete first node of queue
	public void dequeue()
	{
		if (this.front != null)
		{
			if (this.tail == this.front)
			{
				this.tail = null;
				this.front = null;
			}
			else
			{
				this.front = this.front.next;
			}
		}
	}
	public boolean is_empty()
	{
		if (this.front == null)
		{
			return true;
		}
		else
		{
			return false;
		}
	}
}
//Define custom stack and its operation
class MyStack
{
	public StackNode top;
	public MyStack()
	{
		this.top = null;
	}
	//Add a new element in stack
	public void push(int data)
	{
		//Make a new stack node
		StackNode new_node = new StackNode(data);
		if (new_node != null)
		{
			new_node.next = this.top;
			this.top = new_node;
		}
		else
		{
			System.out.print("Memory overflow\n");
		}
	}
	//remove a top element in stack
	public void pop()
	{
		if (this.top != null)
		{
			this.top = this.top.next;
		}
	}
	// Check that whether stack is empty or not
	public boolean is_empty()
	{
		if (this.top != null)
		{
			return false;
		}
		else
		{
			return true;
		}
	}
	// Used to get top element of stack
	public int peek()
	{
		if (this.top != null)
		{
			return this.top.data;
		}
		else
		{
			return 0;
		}
	}
}
//Define Binary Tree 
public class BinaryTree
{
	public TreeNode root;
	public BinaryTree()
	{
		//Set root of tree
		this.root = null;
	}
	public void print_stack(MyStack stack)
	{
		while (stack.is_empty() == false)
		{
			System.out.print("  " + stack.peek());
			stack.pop();
		}
	}
	// Print binary tree level using change direction of given intervals
	public void print_interval(int interval)
	{
		if (this.root == null)
		{
			System.out.print("\n Empty Binary Tree \n");
		}
		else
		{
			System.out.print("\n Direction Interval : " + interval);
			//Get top node in tree
			TreeNode node = this.root;
			//Define a Queue
			MyQueue queue = new MyQueue();
			//Define a stack
			MyStack stack = new MyStack();
			//Add first node at the level of one
			queue.enqueue(node, 1);
			QueueNode temp = queue.front;
			int level = 0;
			int counter = 0;
			//Add tree level
			while (temp != null)
			{
				node = temp.element;
				level = temp.level;
				if (node.left != null)
				{
					//Add left node
					queue.enqueue(node.left, level + 1);
				}
				if (node.right != null)
				{
					//Add right node
					queue.enqueue(node.right, level + 1);
				}
				temp = temp.next;
			}
			// Change the direction in the given interval and print the tree nodes
			while (queue.is_empty() == false)
			{
				// Get interval
				level = (interval - 1) + queue.front.level;
				//Useful to find new levels in tree 
				counter = queue.front.level - 1;
				//print n level
				while (queue.is_empty() == false && queue.front.level <= level)
				{
					if (queue.front.level != counter)
					{
						//switch level
						System.out.print("\n");
						counter = queue.front.level;
					}
					System.out.print("  " + queue.front.element.data);
					//remove  a queue node
					queue.dequeue();
				}
				if (queue.is_empty() == false)
				{
					level = (interval - 1) + queue.front.level;
					counter = queue.front.level;
				}
				// Add interval into stack
				while (queue.is_empty() == false && queue.front.level <= level)
				{
					if (queue.front.level != counter)
					{
						//Switch level
						System.out.print("\n");
						counter = queue.front.level;
						print_stack(stack);
					}
					stack.push(queue.front.element.data);
					//remove a queue node
					queue.dequeue();
				}
				if (stack.is_empty() == false)
				{
					System.out.print("\n");
					print_stack(stack);
				}
			}
		}
	}
	public static void main(String[] args)
	{
		//Create tree object
		BinaryTree tree = new BinaryTree();
		/*
		             8  
		            / \ 
		           /   \                        
		          /     \    
		         5       10    
		        / \     /  \               
		       1   3   11   2  
		      /     \   \    \
		     6       9   4   12
		            /     \    \ 
		           15      13   17
		          /  \     / 
		        20   31   32
		        -----------------
		        Construct binary tree
		*/
		tree.root = new TreeNode(8);
		tree.root.left = new TreeNode(5);
		tree.root.left.right = new TreeNode(3);
		tree.root.left.right.right = new TreeNode(9);
		tree.root.left.right.right.left = new TreeNode(15);
		tree.root.left.right.right.left.left = new TreeNode(20);
		tree.root.left.right.right.left.right = new TreeNode(31);
		tree.root.left.left = new TreeNode(1);
		tree.root.left.left.left = new TreeNode(6);
		tree.root.right = new TreeNode(10);
		tree.root.right.left = new TreeNode(11);
		tree.root.right.left.right = new TreeNode(4);
		tree.root.right.left.right.right = new TreeNode(13);
		tree.root.right.left.right.right.left = new TreeNode(32);
		tree.root.right.right = new TreeNode(2);
		tree.root.right.right.right = new TreeNode(12);
		tree.root.right.right.right.right = new TreeNode(17);
		//Test Cases
		tree.print_interval(2);
		tree.print_interval(1);
		tree.print_interval(3);
	}
}

Output

 Direction Interval : 2
  8
  5  10
  2  11  3  1
  12  4  9  6
  15  13  17
  20  31  32
 Direction Interval : 1
  8
  10  5
  1  3  11  2
  12  4  9  6
  15  13  17
  32  31  20
 Direction Interval : 3
  8
  5  10
  1  3  11  2
  12  4  9  6
  17  13  15
  32  31  20
// Include header file
#include <iostream>

using namespace std;
/*
    C++ Program 
    Level order traversal with direction change of given intervals
*/
//  Binary Tree node
class TreeNode
{
    public: int data;
    TreeNode *left;
    TreeNode *right;
    TreeNode(int data)
    {
        //  Set node value
        this->data = data;
        this->left = NULL;
        this->right = NULL;
    }
};
// Stack Node
class StackNode
{
    public: int data;
    StackNode *next;
    StackNode(int data)
    {
        this->data = data;
        this->next = NULL;
    }
};
//  Queue Node
class QueueNode
{
    public: TreeNode *element;
    QueueNode *next;
    int level;
    QueueNode(TreeNode *element, int level)
    {
        this->element = element;
        this->next = NULL;
        this->level = level;
    }
};
// Define custom queue class
class MyQueue
{
    public: 
    QueueNode *front;
    QueueNode *tail;
    MyQueue()
    {
        this->front = NULL;
        this->tail = NULL;
    }
    // Add a new node at last of queue
    void enqueue(TreeNode *element, int level)
    {
        QueueNode *new_node = new QueueNode(element, level);
        if (this->front == NULL)
        {
            // When first node of queue
            this->front = new_node;
        }
        else
        {
            // Add node at last position
            this->tail->next = new_node;
        }
        this->tail = new_node;
    }
    // Delete first node of queue
    void dequeue()
    {
        if (this->front != NULL)
        {
            QueueNode *temp = this->front;
            if (this->tail == this->front)
            {
                this->tail = NULL;
                this->front = NULL;
            }
            else
            {
                this->front = this->front->next;
            }
            delete temp;
        }
    }
    bool is_empty()
    {
        if (this->front == NULL)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
};
// Define custom stack and its operation
class MyStack
{
    public: StackNode *top;
    MyStack()
    {
        this->top = NULL;
    }
    // Add a new element in stack
    void push(int data)
    {
        // Make a new stack node
        StackNode *new_node = new StackNode(data);
        if (new_node != NULL)
        {
            new_node->next = this->top;
            this->top = new_node;
        }
        else
        {
            cout << "Memory overflow\n";
        }
    }
    // remove a top element in stack
    void pop()
    {
        if (this->top != NULL)
        {
            StackNode *temp = this->top;
            this->top = this->top->next;
            delete temp;
        }
    }
    //  Check that whether stack is empty or not
    bool is_empty()
    {
        if (this->top != NULL)
        {
            return false;
        }
        else
        {
            return true;
        }
    }
    //  Used to get top element of stack
    int peek()
    {
        if (this->top != NULL)
        {
            return this->top->data;
        }
        else
        {
            return 0;
        }
    }
};
// Define Binary Tree
class BinaryTree
{
    public: TreeNode *root;
    BinaryTree()
    {
        // Set root of tree
        this->root = NULL;
    }
    void print_stack(MyStack &stack)
    {
        while (stack.is_empty() == false)
        {
            cout << "  " << stack.peek();
            stack.pop();
        }
    }
    //  Print binary tree level using change direction of given intervals
    void print_interval(int interval)
    {
        if (this->root == NULL)
        {
            cout << "\n Empty Binary Tree \n";
        }
        else
        {
            cout << "\n Direction Interval : " << interval;
            // Get top node in tree
            TreeNode *node = this->root;
            // Define a Queue
            MyQueue queue = MyQueue();
            // Define a stack
            MyStack stack = MyStack();
            // Add first node at the level of one
            queue.enqueue(node, 1);
            QueueNode *temp = queue.front;
            int level = 0;
            int counter = 0;
            // Add tree level
            while (temp != NULL)
            {
                node = temp->element;
                level = temp->level;
                if (node->left != NULL)
                {
                    // Add left node
                    queue.enqueue(node->left, level + 1);
                }
                if (node->right != NULL)
                {
                    // Add right node
                    queue.enqueue(node->right, level + 1);
                }
                temp = temp->next;
            }
            //  Change the direction in the given interval and print the tree nodes
            while (queue.is_empty() == false)
            {
                //  Get interval
                level = (interval - 1) + queue.front->level;
                // Useful to find new levels in tree
                counter = queue.front->level - 1;
                // print n level
                while (queue.is_empty() == false && queue.front->level <= level)
                {
                    if (queue.front->level != counter)
                    {
                        // switch level
                        cout << "\n";
                        counter = queue.front->level;
                    }
                    cout << "  " << queue.front->element->data;
                    // remove  a queue node
                    queue.dequeue();
                }
                if (queue.is_empty() == false)
                {
                    level = (interval - 1) + queue.front->level;
                    counter = queue.front->level;
                }
                //  Add interval into stack
                while (queue.is_empty() == false && queue.front->level <= level)
                {
                    if (queue.front->level != counter)
                    {
                        // Switch level
                        cout << "\n";
                        counter = queue.front->level;
                        this->print_stack(stack);
                    }
                    stack.push(queue.front->element->data);
                    // remove a queue node
                    queue.dequeue();
                }
                if (stack.is_empty() == false)
                {
                    cout << "\n";
                    this->print_stack(stack);
                }
            }
        }
    }
};
int main()
{
    // Create tree object
    BinaryTree tree = BinaryTree();
    /*
                         8  
                        / \ 
                       /   \                        
                      /     \    
                     5       10    
                    / \     /  \               
                   1   3   11   2  
                  /     \   \    \
                 6       9   4   12
                        /     \    \ 
                       15      13   17
                      /  \     / 
                    20   31   32
                    -----------------
                    Construct binary tree
    */
    tree.root = new TreeNode(8);
    tree.root->left = new TreeNode(5);
    tree.root->left->right = new TreeNode(3);
    tree.root->left->right->right = new TreeNode(9);
    tree.root->left->right->right->left = new TreeNode(15);
    tree.root->left->right->right->left->left = new TreeNode(20);
    tree.root->left->right->right->left->right = new TreeNode(31);
    tree.root->left->left = new TreeNode(1);
    tree.root->left->left->left = new TreeNode(6);
    tree.root->right = new TreeNode(10);
    tree.root->right->left = new TreeNode(11);
    tree.root->right->left->right = new TreeNode(4);
    tree.root->right->left->right->right = new TreeNode(13);
    tree.root->right->left->right->right->left = new TreeNode(32);
    tree.root->right->right = new TreeNode(2);
    tree.root->right->right->right = new TreeNode(12);
    tree.root->right->right->right->right = new TreeNode(17);
    // Test Cases
    tree.print_interval(2);
    tree.print_interval(1);
    tree.print_interval(3);
    return 0;
}

Output

 Direction Interval : 2
  8
  5  10
  2  11  3  1
  12  4  9  6
  15  13  17
  20  31  32
 Direction Interval : 1
  8
  10  5
  1  3  11  2
  12  4  9  6
  15  13  17
  32  31  20
 Direction Interval : 3
  8
  5  10
  1  3  11  2
  12  4  9  6
  17  13  15
  32  31  20
// Include namespace system
using System;

/*
    C# Program 
    Level order traversal with direction change of given intervals
*/

//  Binary Tree node
public class TreeNode
{
	public int data;
	public TreeNode left;
	public TreeNode right;
	public TreeNode(int data)
	{
		//  Set node value
		this.data = data;
		this.left = null;
		this.right = null;
	}
}
// Stack Node
public class StackNode
{
	public int data;
	public StackNode next;
	public StackNode(int data)
	{
		this.data = data;
		this.next = null;
	}
}
//  Queue Node
public class QueueNode
{
	public TreeNode element;
	public QueueNode next;
	public int level;
	public QueueNode(TreeNode element, int level)
	{
		this.element = element;
		this.next = null;
		this.level = level;
	}
}
// Define custom queue class
public class MyQueue
{
	public QueueNode front;
	public QueueNode tail;
	public MyQueue()
	{
		this.front = null;
		this.tail = null;
	}
	// Add a new node at last of queue
	public void enqueue(TreeNode element, int level)
	{
		QueueNode new_node = new QueueNode(element, level);
		if (this.front == null)
		{
			// When first node of queue
			this.front = new_node;
		}
		else
		{
			// Add node at last position
			this.tail.next = new_node;
		}
		this.tail = new_node;
	}
	// Delete first node of queue
	public void dequeue()
	{
		if (this.front != null)
		{
			if (this.tail == this.front)
			{
				this.tail = null;
				this.front = null;
			}
			else
			{
				this.front = this.front.next;
			}
		}
	}
	public Boolean is_empty()
	{
		if (this.front == null)
		{
			return true;
		}
		else
		{
			return false;
		}
	}
}
// Define custom stack and its operation
public class MyStack
{
	public StackNode top;
	public MyStack()
	{
		this.top = null;
	}
	// Add a new element in stack
	public void push(int data)
	{
		// Make a new stack node
		StackNode new_node = new StackNode(data);
		if (new_node != null)
		{
			new_node.next = this.top;
			this.top = new_node;
		}
		else
		{
			Console.Write("Memory overflow\n");
		}
	}
	// remove a top element in stack
	public void pop()
	{
		if (this.top != null)
		{
			this.top = this.top.next;
		}
	}
	//  Check that whether stack is empty or not
	public Boolean is_empty()
	{
		if (this.top != null)
		{
			return false;
		}
		else
		{
			return true;
		}
	}
	//  Used to get top element of stack
	public int peek()
	{
		if (this.top != null)
		{
			return this.top.data;
		}
		else
		{
			return 0;
		}
	}
}
// Define Binary Tree
public class BinaryTree
{
	public TreeNode root;
	public BinaryTree()
	{
		// Set root of tree
		this.root = null;
	}
	public void print_stack(MyStack stack)
	{
		while (stack.is_empty() == false)
		{
			Console.Write("  " + stack.peek());
			stack.pop();
		}
	}
	//  Print binary tree level using change direction of given intervals
	public void print_interval(int interval)
	{
		if (this.root == null)
		{
			Console.Write("\n Empty Binary Tree \n");
		}
		else
		{
			Console.Write("\n Direction Interval : " + interval);
			// Get top node in tree
			TreeNode node = this.root;
			// Define a Queue
			MyQueue queue = new MyQueue();
			// Define a stack
			MyStack stack = new MyStack();
			// Add first node at the level of one
			queue.enqueue(node, 1);
			QueueNode temp = queue.front;
			int level = 0;
			int counter = 0;
			// Add tree level
			while (temp != null)
			{
				node = temp.element;
				level = temp.level;
				if (node.left != null)
				{
					// Add left node
					queue.enqueue(node.left, level + 1);
				}
				if (node.right != null)
				{
					// Add right node
					queue.enqueue(node.right, level + 1);
				}
				temp = temp.next;
			}
			//  Change the direction in the given interval and print the tree nodes
			while (queue.is_empty() == false)
			{
				//  Get interval
				level = (interval - 1) + queue.front.level;
				// Useful to find new levels in tree
				counter = queue.front.level - 1;
				// print n level
				while (queue.is_empty() == false && queue.front.level <= level)
				{
					if (queue.front.level != counter)
					{
						// switch level
						Console.Write("\n");
						counter = queue.front.level;
					}
					Console.Write("  " + queue.front.element.data);
					// remove  a queue node
					queue.dequeue();
				}
				if (queue.is_empty() == false)
				{
					level = (interval - 1) + queue.front.level;
					counter = queue.front.level;
				}
				//  Add interval into stack
				while (queue.is_empty() == false && queue.front.level <= level)
				{
					if (queue.front.level != counter)
					{
						// Switch level
						Console.Write("\n");
						counter = queue.front.level;
						print_stack(stack);
					}
					stack.push(queue.front.element.data);
					// remove a queue node
					queue.dequeue();
				}
				if (stack.is_empty() == false)
				{
					Console.Write("\n");
					print_stack(stack);
				}
			}
		}
	}
	public static void Main(String[] args)
	{
		// Create tree object
		BinaryTree tree = new BinaryTree();
		/*
				             8  
				            / \ 
				           /   \                        
				          /     \    
				         5       10    
				        / \     /  \               
				       1   3   11   2  
				      /     \   \    \
				     6       9   4   12
				            /     \    \ 
				           15      13   17
				          /  \     / 
				        20   31   32
				        -----------------
				        Construct binary tree
				*/
		tree.root = new TreeNode(8);
		tree.root.left = new TreeNode(5);
		tree.root.left.right = new TreeNode(3);
		tree.root.left.right.right = new TreeNode(9);
		tree.root.left.right.right.left = new TreeNode(15);
		tree.root.left.right.right.left.left = new TreeNode(20);
		tree.root.left.right.right.left.right = new TreeNode(31);
		tree.root.left.left = new TreeNode(1);
		tree.root.left.left.left = new TreeNode(6);
		tree.root.right = new TreeNode(10);
		tree.root.right.left = new TreeNode(11);
		tree.root.right.left.right = new TreeNode(4);
		tree.root.right.left.right.right = new TreeNode(13);
		tree.root.right.left.right.right.left = new TreeNode(32);
		tree.root.right.right = new TreeNode(2);
		tree.root.right.right.right = new TreeNode(12);
		tree.root.right.right.right.right = new TreeNode(17);
		// Test Cases
		tree.print_interval(2);
		tree.print_interval(1);
		tree.print_interval(3);
	}
}

Output

 Direction Interval : 2
  8
  5  10
  2  11  3  1
  12  4  9  6
  15  13  17
  20  31  32
 Direction Interval : 1
  8
  10  5
  1  3  11  2
  12  4  9  6
  15  13  17
  32  31  20
 Direction Interval : 3
  8
  5  10
  1  3  11  2
  12  4  9  6
  17  13  15
  32  31  20
<?php
/*
    Php Program 
    Level order traversal with direction change of given intervals
*/
//  Binary Tree node
class TreeNode
{
	public $data;
	public $left;
	public $right;

	function __construct($data)
	{
		//  Set node value
		$this->data = $data;
		$this->left = null;
		$this->right = null;
	}
}
// Stack Node
class StackNode
{
	public $data;
	public $next;

	function __construct($data)
	{
		$this->data = $data;
		$this->next = null;
	}
}
//  Queue Node
class QueueNode
{
	public $element;
	public $next;
	public $level;

	function __construct($element, $level)
	{
		$this->element = $element;
		$this->next = null;
		$this->level = $level;
	}
}
// Define custom queue class
class MyQueue
{
	public $front;
	public $tail;

	function __construct()
	{
		$this->front = null;
		$this->tail = null;
	}
	// Add a new node at last of queue
	public	function enqueue($element, $level)
	{
		$new_node = new QueueNode($element, $level);
		if ($this->front == null)
		{
			// When first node of queue
			$this->front = $new_node;
		}
		else
		{
			// Add node at last position
			$this->tail->next = $new_node;
		}
		$this->tail = $new_node;
	}
	// Delete first node of queue
	public	function dequeue()
	{
		if ($this->front != null)
		{
			if ($this->tail == $this->front)
			{
				$this->tail = null;
				$this->front = null;
			}
			else
			{
				$this->front = $this->front->next;
			}
		}
	}
	public	function is_empty()
	{
		if ($this->front == null)
		{
			return true;
		}
		else
		{
			return false;
		}
	}
}
// Define custom stack and its operation
class MyStack
{
	public $top;

	function __construct()
	{
		$this->top = null;
	}
	// Add a new element in stack
	public	function push($data)
	{
		// Make a new stack node
		$new_node = new StackNode($data);
		if ($new_node != null)
		{
			$new_node->next = $this->top;
			$this->top = $new_node;
		}
		else
		{
			echo "Memory overflow\n";
		}
	}
	// remove a top element in stack
	public	function pop()
	{
		if ($this->top != null)
		{
			$this->top = $this->top->next;
		}
	}
	//  Check that whether stack is empty or not
	public	function is_empty()
	{
		if ($this->top != null)
		{
			return false;
		}
		else
		{
			return true;
		}
	}
	//  Used to get top element of stack
	public	function peek()
	{
		if ($this->top != null)
		{
			return $this->top->data;
		}
		else
		{
			return 0;
		}
	}
}
// Define Binary Tree
class BinaryTree
{
	public $root;

	function __construct()
	{
		// Set root of tree
		$this->root = null;
	}
	public	function print_stack($stack)
	{
		while ($stack->is_empty() == false)
		{
			echo "  ". $stack->peek();
			$stack->pop();
		}
	}
	//  Print binary tree level using change direction of given intervals
	public	function print_interval($interval)
	{
		if ($this->root == null)
		{
			echo "\n Empty Binary Tree \n";
		}
		else
		{
			echo "\n Direction Interval : ". $interval;
			// Get top node in tree
			$node = $this->root;
			// Define a Queue
			$queue = new MyQueue();
			// Define a stack
			$stack = new MyStack();
			// Add first node at the level of one
			$queue->enqueue($node, 1);
			$temp = $queue->front;
			$level = 0;
			$counter = 0;
			// Add tree level
			while ($temp != null)
			{
				$node = $temp->element;
				$level = $temp->level;
				if ($node->left != null)
				{
					// Add left node
					$queue->enqueue($node->left, $level + 1);
				}
				if ($node->right != null)
				{
					// Add right node
					$queue->enqueue($node->right, $level + 1);
				}
				$temp = $temp->next;
			}
			//  Change the direction in the given interval and print the tree nodes
			while ($queue->is_empty() == false)
			{
				//  Get interval
				$level = ($interval - 1) + $queue->front->level;
				// Useful to find new levels in tree
				$counter = $queue->front->level - 1;
				// print n level
				while ($queue->is_empty() == false && $queue->front->level <= $level)
				{
					if ($queue->front->level != $counter)
					{
						// switch level
						echo "\n";
						$counter = $queue->front->level;
					}
					echo "  ". $queue->front->element->data;
					// remove  a queue node
					$queue->dequeue();
				}
				if ($queue->is_empty() == false)
				{
					$level = ($interval - 1) + $queue->front->level;
					$counter = $queue->front->level;
				}
				//  Add interval into stack
				while ($queue->is_empty() == false && $queue->front->level <= $level)
				{
					if ($queue->front->level != $counter)
					{
						// Switch level
						echo "\n";
						$counter = $queue->front->level;
						$this->print_stack($stack);
					}
					$stack->push($queue->front->element->data);
					// remove a queue node
					$queue->dequeue();
				}
				if ($stack->is_empty() == false)
				{
					echo "\n";
					$this->print_stack($stack);
				}
			}
		}
	}
}

function main()
{
	// Create tree object
	$tree = new BinaryTree();
	/*
			             8  
			            / \ 
			           /   \                        
			          /     \    
			         5       10    
			        / \     /  \               
			       1   3   11   2  
			      /     \   \    \
			     6       9   4   12
			            /     \    \ 
			           15      13   17
			          /  \     / 
			        20   31   32
			        -----------------
			        Construct binary tree
	*/
	$tree->root = new TreeNode(8);
	$tree->root->left = new TreeNode(5);
	$tree->root->left->right = new TreeNode(3);
	$tree->root->left->right->right = new TreeNode(9);
	$tree->root->left->right->right->left = new TreeNode(15);
	$tree->root->left->right->right->left->left = new TreeNode(20);
	$tree->root->left->right->right->left->right = new TreeNode(31);
	$tree->root->left->left = new TreeNode(1);
	$tree->root->left->left->left = new TreeNode(6);
	$tree->root->right = new TreeNode(10);
	$tree->root->right->left = new TreeNode(11);
	$tree->root->right->left->right = new TreeNode(4);
	$tree->root->right->left->right->right = new TreeNode(13);
	$tree->root->right->left->right->right->left = new TreeNode(32);
	$tree->root->right->right = new TreeNode(2);
	$tree->root->right->right->right = new TreeNode(12);
	$tree->root->right->right->right->right = new TreeNode(17);
	// Test Cases
	$tree->print_interval(2);
	$tree->print_interval(1);
	$tree->print_interval(3);
}
main();

Output

 Direction Interval : 2
  8
  5  10
  2  11  3  1
  12  4  9  6
  15  13  17
  20  31  32
 Direction Interval : 1
  8
  10  5
  1  3  11  2
  12  4  9  6
  15  13  17
  32  31  20
 Direction Interval : 3
  8
  5  10
  1  3  11  2
  12  4  9  6
  17  13  15
  32  31  20
/*
    Node Js Program 
    Level order traversal with direction change of given intervals
*/
//  Binary Tree node
class TreeNode
{
	constructor(data)
	{
		//  Set node value
		this.data = data;
		this.left = null;
		this.right = null;
	}
}
// Stack Node
class StackNode
{
	constructor(data)
	{
		this.data = data;
		this.next = null;
	}
}
//  Queue Node
class QueueNode
{
	constructor(element, level)
	{
		this.element = element;
		this.next = null;
		this.level = level;
	}
}
// Define custom queue class
class MyQueue
{
	constructor()
	{
		this.front = null;
		this.tail = null;
	}
	// Add a new node at last of queue
	enqueue(element, level)
	{
		var new_node = new QueueNode(element, level);
		if (this.front == null)
		{
			// When first node of queue
			this.front = new_node;
		}
		else
		{
			// Add node at last position
			this.tail.next = new_node;
		}
		this.tail = new_node;
	}
	// Delete first node of queue
	dequeue()
	{
		if (this.front != null)
		{
			if (this.tail == this.front)
			{
				this.tail = null;
				this.front = null;
			}
			else
			{
				this.front = this.front.next;
			}
		}
	}
	is_empty()
	{
		if (this.front == null)
		{
			return true;
		}
		else
		{
			return false;
		}
	}
}
// Define custom stack and its operation
class MyStack
{
	constructor()
	{
		this.top = null;
	}
	// Add a new element in stack
	push(data)
	{
		// Make a new stack node
		var new_node = new StackNode(data);
		if (new_node != null)
		{
			new_node.next = this.top;
			this.top = new_node;
		}
		else
		{
			process.stdout.write("Memory overflow\n");
		}
	}
	// remove a top element in stack
	pop()
	{
		if (this.top != null)
		{
			this.top = this.top.next;
		}
	}
	//  Check that whether stack is empty or not
	is_empty()
	{
		if (this.top != null)
		{
			return false;
		}
		else
		{
			return true;
		}
	}
	//  Used to get top element of stack
	peek()
	{
		if (this.top != null)
		{
			return this.top.data;
		}
		else
		{
			return 0;
		}
	}
}
// Define Binary Tree
class BinaryTree
{
	constructor()
	{
		// Set root of tree
		this.root = null;
	}
	print_stack(stack)
	{
		while (stack.is_empty() == false)
		{
			process.stdout.write("  " + stack.peek());
			stack.pop();
		}
	}
	//  Print binary tree level using change direction of given intervals
	print_interval(interval)
	{
		if (this.root == null)
		{
			process.stdout.write("\n Empty Binary Tree \n");
		}
		else
		{
			process.stdout.write("\n Direction Interval : " + interval);
			// Get top node in tree
			var node = this.root;
			// Define a Queue
			var queue = new MyQueue();
			// Define a stack
			var stack = new MyStack();
			// Add first node at the level of one
			queue.enqueue(node, 1);
			var temp = queue.front;
			var level = 0;
			var counter = 0;
			// Add tree level
			while (temp != null)
			{
				node = temp.element;
				level = temp.level;
				if (node.left != null)
				{
					// Add left node
					queue.enqueue(node.left, level + 1);
				}
				if (node.right != null)
				{
					// Add right node
					queue.enqueue(node.right, level + 1);
				}
				temp = temp.next;
			}
			//  Change the direction in the given interval and print the tree nodes
			while (queue.is_empty() == false)
			{
				//  Get interval
				level = (interval - 1) + queue.front.level;
				// Useful to find new levels in tree
				counter = queue.front.level - 1;
				// print n level
				while (queue.is_empty() == false && queue.front.level <= level)
				{
					if (queue.front.level != counter)
					{
						// switch level
						process.stdout.write("\n");
						counter = queue.front.level;
					}
					process.stdout.write("  " + queue.front.element.data);
					// remove  a queue node
					queue.dequeue();
				}
				if (queue.is_empty() == false)
				{
					level = (interval - 1) + queue.front.level;
					counter = queue.front.level;
				}
				//  Add interval into stack
				while (queue.is_empty() == false && queue.front.level <= level)
				{
					if (queue.front.level != counter)
					{
						// Switch level
						process.stdout.write("\n");
						counter = queue.front.level;
						this.print_stack(stack);
					}
					stack.push(queue.front.element.data);
					// remove a queue node
					queue.dequeue();
				}
				if (stack.is_empty() == false)
				{
					process.stdout.write("\n");
					this.print_stack(stack);
				}
			}
		}
	}
}

function main()
{
	// Create tree object
	var tree = new BinaryTree();
	/*
			             8  
			            / \ 
			           /   \                        
			          /     \    
			         5       10    
			        / \     /  \               
			       1   3   11   2  
			      /     \   \    \
			     6       9   4   12
			            /     \    \ 
			           15      13   17
			          /  \     / 
			        20   31   32
			        -----------------
			        Construct binary tree
			*/
	tree.root = new TreeNode(8);
	tree.root.left = new TreeNode(5);
	tree.root.left.right = new TreeNode(3);
	tree.root.left.right.right = new TreeNode(9);
	tree.root.left.right.right.left = new TreeNode(15);
	tree.root.left.right.right.left.left = new TreeNode(20);
	tree.root.left.right.right.left.right = new TreeNode(31);
	tree.root.left.left = new TreeNode(1);
	tree.root.left.left.left = new TreeNode(6);
	tree.root.right = new TreeNode(10);
	tree.root.right.left = new TreeNode(11);
	tree.root.right.left.right = new TreeNode(4);
	tree.root.right.left.right.right = new TreeNode(13);
	tree.root.right.left.right.right.left = new TreeNode(32);
	tree.root.right.right = new TreeNode(2);
	tree.root.right.right.right = new TreeNode(12);
	tree.root.right.right.right.right = new TreeNode(17);
	// Test Cases
	tree.print_interval(2);
	tree.print_interval(1);
	tree.print_interval(3);
}
main();

Output

 Direction Interval : 2
  8
  5  10
  2  11  3  1
  12  4  9  6
  15  13  17
  20  31  32
 Direction Interval : 1
  8
  10  5
  1  3  11  2
  12  4  9  6
  15  13  17
  32  31  20
 Direction Interval : 3
  8
  5  10
  1  3  11  2
  12  4  9  6
  17  13  15
  32  31  20
#  Python 3 Program 
#  Level order traversal with direction change of given intervals

#  Binary Tree node
class TreeNode :
	
	def __init__(self, data) :
		#  Set node value
		self.data = data
		self.left = None
		self.right = None
	

# Stack Node
class StackNode :
	
	def __init__(self, data) :
		self.data = data
		self.next = None
	

#  Queue Node
class QueueNode :
	
	def __init__(self, element, level) :
		self.element = element
		self.next = None
		self.level = level
	

# Define custom queue class
class MyQueue :
	
	def __init__(self) :
		self.front = None
		self.tail = None
	
	# Add a new node at last of queue
	def enqueue(self, element, level) :
		new_node = QueueNode(element, level)
		if (self.front == None) :
			# When first node of queue
			self.front = new_node
		else :
			# Add node at last position
			self.tail.next = new_node
		
		self.tail = new_node
	
	# Delete first node of queue
	def dequeue(self) :
		if (self.front != None) :
			if (self.tail == self.front) :
				self.tail = None
				self.front = None
			else :
				self.front = self.front.next
			
		
	
	def is_empty(self) :
		if (self.front == None) :
			return True
		else :
			return False
		
	

# Define custom stack and its operation
class MyStack :
	
	def __init__(self) :
		self.top = None
	
	# Add a new element in stack
	def push(self, data) :
		# Make a new stack node
		new_node = StackNode(data)
		if (new_node != None) :
			new_node.next = self.top
			self.top = new_node
		else :
			print("Memory overflow\n", end = "")
		
	
	# remove a top element in stack
	def pop(self) :
		if (self.top != None) :
			self.top = self.top.next
		
	
	#  Check that whether stack is empty or not
	def is_empty(self) :
		if (self.top != None) :
			return False
		else :
			return True
		
	
	#  Used to get top element of stack
	def peek(self) :
		if (self.top != None) :
			return self.top.data
		else :
			return 0
		
	

# Define Binary Tree 
class BinaryTree :
	
	def __init__(self) :
		# Set root of tree
		self.root = None
	
	def print_stack(self, stack) :
		while (stack.is_empty() == False) :
			print("  ", stack.peek(), end = "")
			stack.pop()
		
	
	#  Print binary tree level using change direction of given intervals
	def print_interval(self, interval) :
		if (self.root == None) :
			print("\n Empty Binary Tree \n", end = "")
		else :
			print("\n Direction Interval : ", interval, end = "")
			# Get top node in tree
			node = self.root
			# Define a Queue
			queue = MyQueue()
			# Define a stack
			stack = MyStack()
			# Add first node at the level of one
			queue.enqueue(node, 1)
			temp = queue.front
			level = 0
			counter = 0
			# Add tree level
			while (temp != None) :
				node = temp.element
				level = temp.level
				if (node.left != None) :
					# Add left node
					queue.enqueue(node.left, level + 1)
				
				if (node.right != None) :
					# Add right node
					queue.enqueue(node.right, level + 1)
				
				temp = temp.next
			
			#  Change the direction in the given interval and print the tree nodes
			while (queue.is_empty() == False) :
				#  Get interval
				level = (interval - 1) + queue.front.level
				# Useful to find new levels in tree 
				counter = queue.front.level - 1
				# print n level
				while (queue.is_empty() == False and queue.front.level <= level) :
					if (queue.front.level != counter) :
						# switch level
						print("\n", end = "")
						counter = queue.front.level
					
					print("  ", queue.front.element.data, end = "")
					# remove  a queue node
					queue.dequeue()
				
				if (queue.is_empty() == False) :
					level = (interval - 1) + queue.front.level
					counter = queue.front.level
				
				#  Add interval into stack
				while (queue.is_empty() == False and queue.front.level <= level) :
					if (queue.front.level != counter) :
						# Switch level
						print("\n", end = "")
						counter = queue.front.level
						self.print_stack(stack)
					
					stack.push(queue.front.element.data)
					# remove a queue node
					queue.dequeue()
				
				if (stack.is_empty() == False) :
					print("\n", end = "")
					self.print_stack(stack)
				
			
		
	

def main() :
	# Create tree object
	tree = BinaryTree()
	# 
	# 		             8  
	# 		            / \ 
	# 		           /   \                        
	# 		          /     \    
	# 		         5       10    
	# 		        / \     /  \               
	# 		       1   3   11   2  
	# 		      /     \   \    \
	# 		     6       9   4   12
	# 		            /     \    \ 
	# 		           15      13   17
	# 		          /  \     / 
	# 		        20   31   32
	# 		        -----------------
	# 		        Construct binary tree
	# 		
	
	tree.root = TreeNode(8)
	tree.root.left = TreeNode(5)
	tree.root.left.right = TreeNode(3)
	tree.root.left.right.right = TreeNode(9)
	tree.root.left.right.right.left = TreeNode(15)
	tree.root.left.right.right.left.left = TreeNode(20)
	tree.root.left.right.right.left.right = TreeNode(31)
	tree.root.left.left = TreeNode(1)
	tree.root.left.left.left = TreeNode(6)
	tree.root.right = TreeNode(10)
	tree.root.right.left = TreeNode(11)
	tree.root.right.left.right = TreeNode(4)
	tree.root.right.left.right.right = TreeNode(13)
	tree.root.right.left.right.right.left = TreeNode(32)
	tree.root.right.right = TreeNode(2)
	tree.root.right.right.right = TreeNode(12)
	tree.root.right.right.right.right = TreeNode(17)
	# Test Cases
	tree.print_interval(2)
	tree.print_interval(1)
	tree.print_interval(3)

if __name__ == "__main__": main()

Output

 Direction Interval :  2
   8
   5   10
   2   11   3   1
   12   4   9   6
   15   13   17
   20   31   32
 Direction Interval :  1
   8
   10   5
   1   3   11   2
   12   4   9   6
   15   13   17
   32   31   20
 Direction Interval :  3
   8
   5   10
   1   3   11   2
   12   4   9   6
   17   13   15
   32   31   20
#     Ruby Program 
#     Level order traversal with direction change of given intervals

#  Binary Tree node
class TreeNode  
	# Define the accessor and reader of class TreeNode  
	attr_reader :data, :left, :right
	attr_accessor :data, :left, :right
 
	
	def initialize(data) 
		#  Set node value
		self.data = data
		self.left = nil
		self.right = nil
	end

end

# Stack Node
class StackNode  
	# Define the accessor and reader of class StackNode  
	attr_reader :data, :next
	attr_accessor :data, :next
 
	
	def initialize(data) 
		self.data = data
		self.next = nil
	end

end

#  Queue Node
class QueueNode  
	# Define the accessor and reader of class QueueNode  
	attr_reader :element, :next, :level
	attr_accessor :element, :next, :level
 
	
	def initialize(element, level) 
		self.element = element
		self.next = nil
		self.level = level
	end

end

# Define custom queue class
class MyQueue  
	# Define the accessor and reader of class MyQueue  
	attr_reader :front, :tail
	attr_accessor :front, :tail
 
	
	def initialize() 
		self.front = nil
		self.tail = nil
	end

	# Add a new node at last of queue
	def enqueue(element, level) 
		new_node = QueueNode.new(element, level)
		if (self.front == nil) 
			# When first node of queue
			self.front = new_node
		else 
			# Add node at last position
			self.tail.next = new_node
		end

		self.tail = new_node
	end

	# Delete first node of queue
	def dequeue() 
		if (self.front != nil) 
			if (self.tail == self.front) 
				self.tail = nil
				self.front = nil
			else 
				self.front = self.front.next
			end

		end

	end

	def is_empty() 
		if (self.front == nil) 
			return true
		else 
			return false
		end

	end

end

# Define custom stack and its operation
class MyStack  
	# Define the accessor and reader of class MyStack  
	attr_reader :top
	attr_accessor :top
 
	
	def initialize() 
		self.top = nil
	end

	# Add a new element in stack
	def push(data) 
		# Make a new stack node
		new_node = StackNode.new(data)
		if (new_node != nil) 
			new_node.next = self.top
			self.top = new_node
		else 
			print("Memory overflow\n")
		end

	end

	# remove a top element in stack
	def pop() 
		if (self.top != nil) 
			self.top = self.top.next
		end

	end

	#  Check that whether stack is empty or not
	def is_empty() 
		if (self.top != nil) 
			return false
		else 
			return true
		end

	end

	#  Used to get top element of stack
	def peek() 
		if (self.top != nil) 
			return self.top.data
		else 
			return 0
		end

	end

end

# Define Binary Tree 
class BinaryTree  
	# Define the accessor and reader of class BinaryTree  
	attr_reader :root
	attr_accessor :root
 
	
	def initialize() 
		# Set root of tree
		self.root = nil
	end

	def print_stack(stack) 
		while (stack.is_empty() == false) 
			print("  ", stack.peek())
			stack.pop()
		end

	end

	#  Print binary tree level using change direction of given intervals
	def print_interval(interval) 
		if (self.root == nil) 
			print("\n Empty Binary Tree \n")
		else 
			print("\n Direction Interval : ", interval)
			# Get top node in tree
			node = self.root
			# Define a Queue
			queue = MyQueue.new()
			# Define a stack
			stack = MyStack.new()
			# Add first node at the level of one
			queue.enqueue(node, 1)
			temp = queue.front
			level = 0
			counter = 0
			# Add tree level
			while (temp != nil) 
				node = temp.element
				level = temp.level
				if (node.left != nil) 
					# Add left node
					queue.enqueue(node.left, level + 1)
				end

				if (node.right != nil) 
					# Add right node
					queue.enqueue(node.right, level + 1)
				end

				temp = temp.next
			end

			#  Change the direction in the given interval and print the tree nodes
			while (queue.is_empty() == false) 
				#  Get interval
				level = (interval - 1) + queue.front.level
				# Useful to find new levels in tree 
				counter = queue.front.level - 1
				# print n level
				while (queue.is_empty() == false && queue.front.level <= level) 
					if (queue.front.level != counter) 
						# switch level
						print("\n")
						counter = queue.front.level
					end

					print("  ", queue.front.element.data)
					# remove  a queue node
					queue.dequeue()
				end

				if (queue.is_empty() == false) 
					level = (interval - 1) + queue.front.level
					counter = queue.front.level
				end

				#  Add interval into stack
				while (queue.is_empty() == false && queue.front.level <= level) 
					if (queue.front.level != counter) 
						# Switch level
						print("\n")
						counter = queue.front.level
						self.print_stack(stack)
					end

					stack.push(queue.front.element.data)
					# remove a queue node
					queue.dequeue()
				end

				if (stack.is_empty() == false) 
					print("\n")
					self.print_stack(stack)
				end

			end

		end

	end

end

def main() 
	# Create tree object
	tree = BinaryTree.new()
	# 
	# 		             8  
	# 		            / \ 
	# 		           /   \                        
	# 		          /     \    
	# 		         5       10    
	# 		        / \     /  \               
	# 		       1   3   11   2  
	# 		      /     \   \    \
	# 		     6       9   4   12
	# 		            /     \    \ 
	# 		           15      13   17
	# 		          /  \     / 
	# 		        20   31   32
	# 		        -----------------
	# 		        Construct binary tree
	# 		
	
	tree.root = TreeNode.new(8)
	tree.root.left = TreeNode.new(5)
	tree.root.left.right = TreeNode.new(3)
	tree.root.left.right.right = TreeNode.new(9)
	tree.root.left.right.right.left = TreeNode.new(15)
	tree.root.left.right.right.left.left = TreeNode.new(20)
	tree.root.left.right.right.left.right = TreeNode.new(31)
	tree.root.left.left = TreeNode.new(1)
	tree.root.left.left.left = TreeNode.new(6)
	tree.root.right = TreeNode.new(10)
	tree.root.right.left = TreeNode.new(11)
	tree.root.right.left.right = TreeNode.new(4)
	tree.root.right.left.right.right = TreeNode.new(13)
	tree.root.right.left.right.right.left = TreeNode.new(32)
	tree.root.right.right = TreeNode.new(2)
	tree.root.right.right.right = TreeNode.new(12)
	tree.root.right.right.right.right = TreeNode.new(17)
	# Test Cases
	tree.print_interval(2)
	tree.print_interval(1)
	tree.print_interval(3)
end

main()

Output

 Direction Interval : 2
  8
  5  10
  2  11  3  1
  12  4  9  6
  15  13  17
  20  31  32
 Direction Interval : 1
  8
  10  5
  1  3  11  2
  12  4  9  6
  15  13  17
  32  31  20
 Direction Interval : 3
  8
  5  10
  1  3  11  2
  12  4  9  6
  17  13  15
  32  31  20
/*
    Scala Program 
    Level order traversal with direction change of given intervals
*/
//  Binary Tree node
class TreeNode(var data: Int , var left: TreeNode , var right: TreeNode)
{
	def this(data: Int)
	{
		this(data, null, null);
	}
}
// Stack Node
class StackNode(var data: Int , var next: StackNode)
{
	def this(data: Int)
	{
		this(data, null);
	}
}
//  Queue Node
class QueueNode(var element: TreeNode , var next: QueueNode , var level: Int)
{
	def this(element: TreeNode, level: Int)
	{
		this(element, null, level);
	}
}
// Define custom queue class
class MyQueue(var front: QueueNode , var tail: QueueNode)
{
	def this()
	{
		this(null, null);
	}
	// Add a new node at last of queue
	def enqueue(element: TreeNode, level: Int): Unit = {
		var new_node: QueueNode = new QueueNode(element, level);
		if (this.front == null)
		{
			// When first node of queue
			this.front = new_node;
		}
		else
		{
			// Add node at last position
			this.tail.next = new_node;
		}
		this.tail = new_node;
	}
	// Delete first node of queue
	def dequeue(): Unit = {
		if (this.front != null)
		{
			if (this.tail == this.front)
			{
				this.tail = null;
				this.front = null;
			}
			else
			{
				this.front = this.front.next;
			}
		}
	}
	def is_empty(): Boolean = {
		if (this.front == null)
		{
			return true;
		}
		else
		{
			return false;
		}
	}
}
// Define custom stack and its operation
class MyStack(var top: StackNode)
{
	def this()
	{
		this(null);
	}
	// Add a new element in stack
	def push(data: Int): Unit = {
		// Make a new stack node
		var new_node: StackNode = new StackNode(data);
		if (new_node != null)
		{
			new_node.next = this.top;
			this.top = new_node;
		}
		else
		{
			print("Memory overflow\n");
		}
	}
	// remove a top element in stack
	def pop(): Unit = {
		if (this.top != null)
		{
			this.top = this.top.next;
		}
	}
	//  Check that whether stack is empty or not
	def is_empty(): Boolean = {
		if (this.top != null)
		{
			return false;
		}
		else
		{
			return true;
		}
	}
	//  Used to get top element of stack
	def peek(): Int = {
		if (this.top != null)
		{
			return this.top.data;
		}
		else
		{
			return 0;
		}
	}
}
// Define Binary Tree
class BinaryTree(var root: TreeNode)
{
	def this()
	{
		this(null);
	}
	def print_stack(stack: MyStack): Unit = {
		while (stack.is_empty() == false)
		{
			print("  " + stack.peek());
			stack.pop();
		}
	}
	//  Print binary tree level using change direction of given intervals
	def print_interval(interval: Int): Unit = {
		if (this.root == null)
		{
			print("\n Empty Binary Tree \n");
		}
		else
		{
			print("\n Direction Interval : " + interval);
			// Get top node in tree
			var node: TreeNode = this.root;
			// Define a Queue
			var queue: MyQueue = new MyQueue();
			// Define a stack
			var stack: MyStack = new MyStack();
			// Add first node at the level of one
			queue.enqueue(node, 1);
			var temp: QueueNode = queue.front;
			var level: Int = 0;
			var counter: Int = 0;
			// Add tree level
			while (temp != null)
			{
				node = temp.element;
				level = temp.level;
				if (node.left != null)
				{
					// Add left node
					queue.enqueue(node.left, level + 1);
				}
				if (node.right != null)
				{
					// Add right node
					queue.enqueue(node.right, level + 1);
				}
				temp = temp.next;
			}
			//  Change the direction in the given interval and print the tree nodes
			while (queue.is_empty() == false)
			{
				//  Get interval
				level = (interval - 1) + queue.front.level;
				// Useful to find new levels in tree
				counter = queue.front.level - 1;
				// print n level
				while (queue.is_empty() == false && queue.front.level <= level)
				{
					if (queue.front.level != counter)
					{
						// switch level
						print("\n");
						counter = queue.front.level;
					}
					print("  " + queue.front.element.data);
					// remove  a queue node
					queue.dequeue();
				}
				if (queue.is_empty() == false)
				{
					level = (interval - 1) + queue.front.level;
					counter = queue.front.level;
				}
				//  Add interval into stack
				while (queue.is_empty() == false && queue.front.level <= level)
				{
					if (queue.front.level != counter)
					{
						// Switch level
						print("\n");
						counter = queue.front.level;
						print_stack(stack);
					}
					stack.push(queue.front.element.data);
					// remove a queue node
					queue.dequeue();
				}
				if (stack.is_empty() == false)
				{
					print("\n");
					print_stack(stack);
				}
			}
		}
	}
}
object Main
{
	def main(args: Array[String]): Unit = {
		// Create tree object
		var tree: BinaryTree = new BinaryTree();
		/*
				             8  
				            / \ 
				           /   \                        
				          /     \    
				         5       10    
				        / \     /  \               
				       1   3   11   2  
				      /     \   \    \
				     6       9   4   12
				            /     \    \ 
				           15      13   17
				          /  \     / 
				        20   31   32
				        -----------------
				        Construct binary tree
				*/
		tree.root = new TreeNode(8);
		tree.root.left = new TreeNode(5);
		tree.root.left.right = new TreeNode(3);
		tree.root.left.right.right = new TreeNode(9);
		tree.root.left.right.right.left = new TreeNode(15);
		tree.root.left.right.right.left.left = new TreeNode(20);
		tree.root.left.right.right.left.right = new TreeNode(31);
		tree.root.left.left = new TreeNode(1);
		tree.root.left.left.left = new TreeNode(6);
		tree.root.right = new TreeNode(10);
		tree.root.right.left = new TreeNode(11);
		tree.root.right.left.right = new TreeNode(4);
		tree.root.right.left.right.right = new TreeNode(13);
		tree.root.right.left.right.right.left = new TreeNode(32);
		tree.root.right.right = new TreeNode(2);
		tree.root.right.right.right = new TreeNode(12);
		tree.root.right.right.right.right = new TreeNode(17);
		// Test Cases
		tree.print_interval(2);
		tree.print_interval(1);
		tree.print_interval(3);
	}
}

Output

 Direction Interval : 2
  8
  5  10
  2  11  3  1
  12  4  9  6
  15  13  17
  20  31  32
 Direction Interval : 1
  8
  10  5
  1  3  11  2
  12  4  9  6
  15  13  17
  32  31  20
 Direction Interval : 3
  8
  5  10
  1  3  11  2
  12  4  9  6
  17  13  15
  32  31  20
/*
    Swift 4 Program 
    Level order traversal with direction change of given intervals
*/
//  Binary Tree node
class TreeNode
{
	var data: Int;
	var left: TreeNode? ;
	var right: TreeNode? ;
	init(_ data: Int)
	{
		//  Set node value
		self.data = data;
		self.left = nil;
		self.right = nil;
	}
}
// Stack Node
class StackNode
{
	var data: Int;
	var next: StackNode? ;
	init(_ data: Int)
	{
		self.data = data;
		self.next = nil;
	}
}
//  Queue Node
class QueueNode
{
	var element: TreeNode? ;
	var next: QueueNode? ;
	var level: Int;
	init(_ element: TreeNode? , _ level : Int)
	{
		self.element = element;
		self.next = nil;
		self.level = level;
	}
}
// Define custom queue class
class MyQueue
{
	var front: QueueNode? ;
	var tail: QueueNode? ;
	init()
	{
		self.front = nil;
		self.tail = nil;
	}
	// Add a new node at last of queue
	func enqueue(_ element: TreeNode? , _ level : Int)
	{
		let new_node: QueueNode? = QueueNode(element, level);
		if (self.front == nil)
		{
			// When first node of queue
			self.front = new_node;
		}
		else
		{
			// Add node at last position
			self.tail!.next = new_node;
		}
		self.tail = new_node;
	}
	// Delete first node of queue
	func dequeue()
	{
		if (self.front != nil)
		{
			if (self.tail === self.front)
			{
				self.tail = nil;
				self.front = nil;
			}
			else
			{
				self.front = self.front!.next;
			}
		}
	}
	func is_empty()->Bool
	{
		if (self.front == nil)
		{
			return true;
		}
		else
		{
			return false;
		}
	}
}
// Define custom stack and its operation
class MyStack
{
	var top: StackNode? ;
	init()
	{
		self.top = nil;
	}
	// Add a new element in stack
	func push(_ data: Int)
	{
		// Make a new stack node
		let new_node: StackNode? = StackNode(data);
		if (new_node != nil)
		{
			new_node!.next = self.top;
			self.top = new_node;
		}
		else
		{
			print("Memory overflow\n", terminator: "");
		}
	}
	// remove a top element in stack
	func pop()
	{
		if (self.top != nil)
		{
			self.top = self.top!.next;
		}
	}
	//  Check that whether stack is empty or not
	func is_empty()->Bool
	{
		if (self.top != nil)
		{
			return false;
		}
		else
		{
			return true;
		}
	}
	//  Used to get top element of stack
	func peek()->Int
	{
		if (self.top != nil)
		{
			return self.top!.data;
		}
		else
		{
			return 0;
		}
	}
}
// Define Binary Tree
class BinaryTree
{
	var root: TreeNode? ;
	init()
	{
		// Set root of tree
		self.root = nil;
	}
	func print_stack(_ stack: MyStack)
	{
		while (stack.is_empty() == false)
		{
			print("  ", stack.peek(), terminator: "");
			stack.pop();
		}
	}
	//  Print binary tree level using change direction of given intervals
	func print_interval(_ interval: Int)
	{
		if (self.root == nil)
		{
			print("\n Empty Binary Tree \n", terminator: "");
		}
		else
		{
			print("\n Direction Interval : ", interval, terminator: "");
			// Get top node in tree
			var node: TreeNode? = self.root;
			// Define a Queue
			let queue: MyQueue = MyQueue();
			// Define a stack
			let stack: MyStack = MyStack();
			// Add first node at the level of one
			queue.enqueue(node, 1);
			var temp: QueueNode? = queue.front;
			var level: Int = 0;
			var counter: Int = 0;
			// Add tree level
			while (temp != nil)
			{
				node = temp!.element;
				level = temp!.level;
				if (node!.left != nil)
				{
					// Add left node
					queue.enqueue(node!.left, level + 1);
				}
				if (node!.right != nil)
				{
					// Add right node
					queue.enqueue(node!.right, level + 1);
				}
				temp = temp!.next;
			}
			//  Change the direction in the given interval and print the tree nodes
			while (queue.is_empty() == false)
			{
				//  Get interval
				level = (interval - 1) + queue.front!.level;
				// Useful to find new levels in tree
				counter = queue.front!.level - 1;
				// print n level
				while (queue.is_empty() == false && queue.front!.level <= level)
				{
					if (queue.front!.level != counter)
					{
						// switch level
						print("\n", terminator: "");
						counter = queue.front!.level;
					}
					print("  ", queue.front!.element!.data, terminator: "");
					// remove  a queue node
					queue.dequeue();
				}
				if (queue.is_empty() == false)
				{
					level = (interval - 1) + queue.front!.level;
					counter = queue.front!.level;
				}
				//  Add interval into stack
				while (queue.is_empty() == false && queue.front!.level <= level)
				{
					if (queue.front!.level != counter)
					{
						// Switch level
						print("\n", terminator: "");
						counter = queue.front!.level;
						self.print_stack(stack);
					}
					stack.push(queue.front!.element!.data);
					// remove a queue node
					queue.dequeue();
				}
				if (stack.is_empty() == false)
				{
					print("\n", terminator: "");
					self.print_stack(stack);
				}
			}
		}
	}
}
func main()
{
	// Create tree object
	let tree: BinaryTree = BinaryTree();
	/*
		             8  
		            / \ 
		           /   \                        
		          /     \    
		         5       10    
		        / \     /  \               
		       1   3   11   2  
		      /     \   \    \
		     6       9   4   12
		            /     \    \ 
		           15      13   17
		          /  \     / 
		        20   31   32
		        -----------------
		        Construct binary tree
		*/
	tree.root = TreeNode(8);
	tree.root!.left = TreeNode(5);
	tree.root!.left!.right = TreeNode(3);
	tree.root!.left!.right!.right = TreeNode(9);
	tree.root!.left!.right!.right!.left = TreeNode(15);
	tree.root!.left!.right!.right!.left!.left = TreeNode(20);
	tree.root!.left!.right!.right!.left!.right = TreeNode(31);
	tree.root!.left!.left = TreeNode(1);
	tree.root!.left!.left!.left = TreeNode(6);
	tree.root!.right = TreeNode(10);
	tree.root!.right!.left = TreeNode(11);
	tree.root!.right!.left!.right = TreeNode(4);
	tree.root!.right!.left!.right!.right = TreeNode(13);
	tree.root!.right!.left!.right!.right!.left = TreeNode(32);
	tree.root!.right!.right = TreeNode(2);
	tree.root!.right!.right!.right = TreeNode(12);
	tree.root!.right!.right!.right!.right = TreeNode(17);
	// Test Cases
	tree.print_interval(2);
	tree.print_interval(1);
	tree.print_interval(3);
}
main();

Output

 Direction Interval :  2
   8
   5   10
   2   11   3   1
   12   4   9   6
   15   13   17
   20   31   32
 Direction Interval :  1
   8
   10   5
   1   3   11   2
   12   4   9   6
   15   13   17
   32   31   20
 Direction Interval :  3
   8
   5   10
   1   3   11   2
   12   4   9   6
   17   13   15
   32   31   20

Comment

Please share your knowledge to improve code and content standard. Also submit your doubts, and test case. We improve by your feedback. We will try to resolve your query as soon as possible.

New Comment