Print Binary Tree in 2-Dimensions - GeeksforGeeks

14 Dec, 2021
Given a Binary Tree, print it in two dimension.Examples:  
Input : Pointer to root of below tree
             1
            /  \
           2    3 
          / \   / \
         4   5  6  7 

Output :
                    7

          3

                    6

1

                    5

          2

                    4
We strongly recommend you to minimize your browser and try this yourself first.If we take a closer look at the pattern, we can notice following. 1) Rightmost node is printed in first line and leftmost node is printed in last line. 2) Space count increases by a fixed amount at every level.So we do a reverse inorder traversal (right – root – left) and print tree nodes. We increase space by a fixed amount at every level.Below is the implementation.  
C++
C
Java
Python3
C#
Javascript
// C++ Program to print binary tree in 2D#include<bits/stdc++.h> using namespace std;#define COUNT 10 // A binary tree nodeclass Node{    public:    int data;    Node* left, *right;         /* Constructor that allocates a new node with the    given data and NULL left and right pointers. */    Node(int data){        this->data = data;        this->left = NULL;        this->right = NULL;    }}; // Function to print binary tree in 2D// It does reverse inorder traversalvoid print2DUtil(Node *root, int space){    // Base case    if (root == NULL)        return;     // Increase distance between levels    space += COUNT;     // Process right child first    print2DUtil(root->right, space);     // Print current node after space    // count    cout<<endl;    for (int i = COUNT; i < space; i++)        cout<<" ";    cout<<root->data<<"\n";     // Process left child    print2DUtil(root->left, space);} // Wrapper over print2DUtil()void print2D(Node *root){    // Pass initial space count as 0    print2DUtil(root, 0);} // Driver codeint main(){    Node *root = new Node(1);    root->left = new Node(2);    root->right = new Node(3);     root->left->left = new Node(4);    root->left->right = new Node(5);    root->right->left = new Node(6);    root->right->right = new Node(7);     root->left->left->left = new Node(8);    root->left->left->right = new Node(9);    root->left->right->left = new Node(10);    root->left->right->right = new Node(11);    root->right->left->left = new Node(12);    root->right->left->right = new Node(13);    root->right->right->left = new Node(14);    root->right->right->right = new Node(15);         print2D(root);     return 0;} // This code is contributed by rathbhupendra
// Program to print binary tree in 2D#include<stdio.h>#include<malloc.h>#define COUNT 10 // A binary tree nodestruct Node{    int data;    struct Node* left, *right;}; // Helper function to allocates a new nodestruct Node* newNode(int data){    struct Node* node = malloc(sizeof(struct Node));    node->data = data;    node->left = node->right = NULL;    return node;} // Function to print binary tree in 2D// It does reverse inorder traversalvoid print2DUtil(struct Node *root, int space){    // Base case    if (root == NULL)        return;     // Increase distance between levels    space += COUNT;     // Process right child first    print2DUtil(root->right, space);     // Print current node after space    // count    printf("\n");    for (int i = COUNT; i < space; i++)        printf(" ");    printf("%d\n", root->data);     // Process left child    print2DUtil(root->left, space);} // Wrapper over print2DUtil()void print2D(struct Node *root){   // Pass initial space count as 0   print2DUtil(root, 0);} // Driver program to test above functionsint main(){    struct Node *root   = newNode(1);    root->left   = newNode(2);    root->right  = newNode(3);     root->left->left  = newNode(4);    root->left->right = newNode(5);    root->right->left  = newNode(6);    root->right->right = newNode(7);     root->left->left->left  = newNode(8);    root->left->left->right  = newNode(9);    root->left->right->left  = newNode(10);    root->left->right->right  = newNode(11);    root->right->left->left  = newNode(12);    root->right->left->right  = newNode(13);    root->right->right->left  = newNode(14);    root->right->right->right  = newNode(15);         print2D(root);     return 0;}
// Java Program to print binary tree in 2Dclass GFG{     static final int COUNT = 10; // A binary tree nodestatic class Node{    int data;    Node left, right;         /* Constructor that allocates a new node with the    given data and null left and right pointers. */    Node(int data)    {        this.data = data;        this.left = null;        this.right = null;    }}; // Function to print binary tree in 2D// It does reverse inorder traversalstatic void print2DUtil(Node root, int space){    // Base case    if (root == null)        return;     // Increase distance between levels    space += COUNT;     // Process right child first    print2DUtil(root.right, space);     // Print current node after space    // count    System.out.print("\n");    for (int i = COUNT; i < space; i++)        System.out.print(" ");    System.out.print(root.data + "\n");     // Process left child    print2DUtil(root.left, space);} // Wrapper over print2DUtil()static void print2D(Node root){    // Pass initial space count as 0    print2DUtil(root, 0);} // Driver codepublic static void main(String args[]){    Node root = new Node(1);    root.left = new Node(2);    root.right = new Node(3);     root.left.left = new Node(4);    root.left.right = new Node(5);    root.right.left = new Node(6);    root.right.right = new Node(7);     root.left.left.left = new Node(8);    root.left.left.right = new Node(9);    root.left.right.left = new Node(10);    root.left.right.right = new Node(11);    root.right.left.left = new Node(12);    root.right.left.right = new Node(13);    root.right.right.left = new Node(14);    root.right.right.right = new Node(15);         print2D(root);}} // This code is contributed by Arnab Kundu
# Python3 Program to print binary tree in 2DCOUNT = [10] # Binary Tree Node""" utility that allocates a newNodewith the given key """class newNode:     # Construct to create a newNode    def __init__(self, key):        self.data = key        self.left = None        self.right = None # Function to print binary tree in 2D# It does reverse inorder traversaldef print2DUtil(root, space) :     # Base case    if (root == None) :        return     # Increase distance between levels    space += COUNT[0]     # Process right child first    print2DUtil(root.right, space)     # Print current node after space    # count    print()    for i in range(COUNT[0], space):        print(end = " ")    print(root.data)     # Process left child    print2DUtil(root.left, space) # Wrapper over print2DUtil()def print2D(root) :         # space=[0]    # Pass initial space count as 0    print2DUtil(root, 0) # Driver Codeif __name__ == '__main__':     root = newNode(1)    root.left = newNode(2)    root.right = newNode(3)     root.left.left = newNode(4)    root.left.right = newNode(5)    root.right.left = newNode(6)    root.right.right = newNode(7)     root.left.left.left = newNode(8)    root.left.left.right = newNode(9)    root.left.right.left = newNode(10)    root.left.right.right = newNode(11)    root.right.left.left = newNode(12)    root.right.left.right = newNode(13)    root.right.right.left = newNode(14)    root.right.right.right = newNode(15)         print2D(root) # This code is contributed by# Shubham Singh(SHUBHAMSINGH10)
// C# Program to print binary tree in 2Dusing System; class GFG{     static readonly int COUNT = 10; // A binary tree nodepublic class Node{    public int data;    public Node left, right;         /* Constructor that allocates a new node with the    given data and null left and right pointers. */    public Node(int data)    {        this.data = data;        this.left = null;        this.right = null;    }}; // Function to print binary tree in 2D// It does reverse inorder traversalstatic void print2DUtil(Node root, int space){    // Base case    if (root == null)        return;     // Increase distance between levels    space += COUNT;     // Process right child first    print2DUtil(root.right, space);     // Print current node after space    // count    Console.Write("\n");    for (int i = COUNT; i < space; i++)        Console.Write(" ");    Console.Write(root.data + "\n");     // Process left child    print2DUtil(root.left, space);} // Wrapper over print2DUtil()static void print2D(Node root){    // Pass initial space count as 0    print2DUtil(root, 0);} // Driver codepublic static void Main(String []args){    Node root = new Node(1);    root.left = new Node(2);    root.right = new Node(3);     root.left.left = new Node(4);    root.left.right = new Node(5);    root.right.left = new Node(6);    root.right.right = new Node(7);     root.left.left.left = new Node(8);    root.left.left.right = new Node(9);    root.left.right.left = new Node(10);    root.left.right.right = new Node(11);    root.right.left.left = new Node(12);    root.right.left.right = new Node(13);    root.right.right.left = new Node(14);    root.right.right.right = new Node(15);         print2D(root);}} // This code is contributed by Princi Singh
<script> // JavaScript Program to print binary tree in 2D let COUNT = 10; // A binary tree nodeclass Node{    constructor(data)    {        this.data = data;        this.left = null;        this.right = null;    }} // Function to print binary tree in 2D// It does reverse inorder traversalfunction print2DUtil(root,space){    // Base case    if (root == null)        return;       // Increase distance between levels    space += COUNT;       // Process right child first    print2DUtil(root.right, space);       // Print current node after space    // count    document.write("<br>");    for (let i = COUNT; i < space; i++)        document.write("  ");    document.write(root.data + "\n");       // Process left child    print2DUtil(root.left, space);} // Wrapper over print2DUtil()function print2D(root){    // Pass initial space count as 0    print2DUtil(root, 0);} // Driver codelet root = new Node(1);root.left = new Node(2);root.right = new Node(3); root.left.left = new Node(4);root.left.right = new Node(5);root.right.left = new Node(6);root.right.right = new Node(7); root.left.left.left = new Node(8);root.left.left.right = new Node(9);root.left.right.left = new Node(10);root.left.right.right = new Node(11);root.right.left.left = new Node(12);root.right.left.right = new Node(13);root.right.right.left = new Node(14);root.right.right.right = new Node(15); print2D(root);   // This code is contributed by patel2127 </script>
Output: 
                              15

                    7

                              14

          3

                              13

                    6

                              12

1

                              11

                    5

                              10

          2

                              9

                    4

                              8
Another solution using level order traversal:
Java
import java.util.LinkedList; public class Tree1 {     public static void main(String[] args) {         Tree1.Node root = new Tree1.Node(1);        Tree1.Node temp = null;        temp = new Tree1.Node(2);        root.left=temp;        temp = new Tree1.Node(3);        root.right=temp;         temp = new Tree1.Node(4);        root.left.left = temp;        temp=new Tree1.Node(5);        root.left.right =temp;        temp=new Tree1.Node(6);        root.right.left =temp;        temp=new Tree1.Node(7);        root.right.right = temp;         temp = new Tree1.Node(8);        root.left.left.left = temp;        temp = new Tree1.Node(9);        root.left.left.right = temp;        temp=new Tree1.Node(10);        root.left.right.left = temp;        temp=new Tree1.Node(11);        root.left.right.right = temp;        temp=new Tree1.Node(12);        root.right.left.left = temp;        temp=new Tree1.Node(13);        root.right.left.right = temp;        temp=new Tree1.Node(14);        root.right.right.left = temp;        temp=new Tree1.Node(15);        root.right.right.right = temp;         printBinaryTree(root);     } public static class Node{     public Node(int data){        this.data = data;    }    int data;    Node left;    Node right;}     public static void printBinaryTree(Node root) {        LinkedList<Node> treeLevel = new LinkedList<Node>();        treeLevel.add(root);        LinkedList<Node> temp = new LinkedList<Node>();        int counter = 0;        int height = heightOfTree(root)-1;        //System.out.println(height);        double numberOfElements = (Math.pow(2 , (height + 1)) - 1);        //System.out.println(numberOfElements);        while (counter <= height) {            Node removed = treeLevel.removeFirst();            if (temp.isEmpty()) {                printSpace(numberOfElements / Math.pow(2 , counter + 1), removed);            } else {                printSpace(numberOfElements / Math.pow(2 , counter), removed);            }            if (removed == null) {                temp.add(null);                temp.add(null);            } else {                temp.add(removed.left);                temp.add(removed.right);            }             if (treeLevel.isEmpty()) {                System.out.println("");                System.out.println("");                treeLevel = temp;                temp = new LinkedList<>();                counter++;            }         }    } public static void printSpace(double n, Node removed){    for(;n>0;n--) {            System.out.print("\t");    }    if(removed == null){        System.out.print(" ");    }    else {        System.out.print(removed.data);    }} public static int heightOfTree(Node root){    if(root==null){        return 0;    }     return 1+ Math.max(heightOfTree(root.left),heightOfTree(root.right));} }
                                1

                2                                3

        4                5                6                7

    8        9        10        11        12        13        14        15
 Output:
YouTubeGeeksforGeeks507K subscribersPrint Binary Tree in 2-Dimensions | GeeksforGeeksWatch laterShareCopy linkInfoShoppingTap to unmuteIf playback doesn't begin shortly, try restarting your device.More videosMore videosYou're signed outVideos you watch may be added to the TV's watch history and influence TV recommendations. To avoid this, cancel and sign in to YouTube on your computer.CancelConfirmSwitch cameraShareInclude playlistAn error occurred while retrieving sharing information. Please try again later.Watch on0:000:000:00 / 4:39•Live•<div class="player-unavailable"><h1 class="message">An error occurred.</h1><div class="submessage"><a href="https://www.youtube.com/watch?v=eY3SZLGCK2E" target="_blank">Try watching this video on www.youtube.com</a>, or enable JavaScript if it is disabled in your browser.</div></div>
This article is contributed by Aditya Goel. If you like GeeksforGeeks and would like to contribute, you can also write an article and mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above 
SHUBHAMSINGH10
rathbhupendra
andrew1234
princi singh
SnehanjanChatterjee
avanitrachhadiya2155
rishabsrivastava
Tree
Tree
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Decision Tree
Introduction to Tree Data Structure
Lowest Common Ancestor in a Binary Tree | Set 1
Complexity of different operations in Binary tree, Binary Search Tree and AVL tree
Expression Tree
Deletion in a Binary Tree
Binary Tree (Array implementation)
BFS vs DFS for Binary Tree
AVL Tree | Set 2 (Deletion)
Insertion in a Binary Tree in level order