Iterative Method To Print Left View of a Binary Tree

06 Aug, 2021
Given a Binary Tree, print it’s left view. Left view of a Binary Tree is a set of nodes visible when tree is seen from the left side . 
Examples:  
Input :        1
             /   \
            2     3
           / \   / \
          4   5 6   7
Output : 1 2 4

Input :         1
              /   \
             2     3
              \   /
               4 5
                  \
                   6
                  / \
                 7   8
Output : 1 2 4 6 7
 
We have already discussed this problem using the Recursion method, here iterative approach is used to solve the above problem.The idea is to do level order traversal of the Tree using a queue and print the first node at each level. While doing level order traversal, after traversing all node at each level, push a NULL delimiter to mark the end of the current level. So, do the level order traversal of the tree. Print the first node at each level in the tree and push the children of all nodes at each level in the queue until a NULL delimiter is encountered. Below is the implementation of above approach:  
C++
Java
Python3
C#
Javascript
// C++ program to print the// left view of Binary Tree #include <bits/stdc++.h> using namespace std; // A Binary Tree Nodestruct node {    int data;    struct node *left, *right;}; // A utility function to create a new// Binary Tree nodestruct node* newNode(int item){    struct node* temp = new node;    temp->data = item;    temp->left = NULL;    temp->right = NULL;    return temp;} // Utility function to print the left view of// the binary treevoid leftViewUtil(struct node* root, queue<node*>& q){    if (root == NULL)        return;     // Push root    q.push(root);     // Delimiter    q.push(NULL);     while (!q.empty()) {        node* temp = q.front();         if (temp) {             // Prints first node            // of each level            cout << temp->data << " ";             // Push children of all nodes at            // current level            while (q.front() != NULL) {                 // If left child is present                // push into queue                if (temp->left)                    q.push(temp->left);                 // If right child is present                // push into queue                if (temp->right)                    q.push(temp->right);                 // Pop the current node                q.pop();                 temp = q.front();            }             // Push delimiter            // for the next level            q.push(NULL);        }         // Pop the delimiter of        // the previous level        q.pop();    }} // Function to print the leftView// of Binary Treevoid leftView(struct node* root){    // Queue to store all    // the nodes of the tree    queue<node*> q;     leftViewUtil(root, q);} // Driver Codeint main(){    struct node* root = newNode(10);    root->left = newNode(12);    root->right = newNode(3);    root->left->right = newNode(4);    root->right->left = newNode(5);    root->right->left->right = newNode(6);    root->right->left->right->left = newNode(18);    root->right->left->right->right = newNode(7);     leftView(root);     return 0;}
// Java program to print the// left view of Binary Treeimport java.util.*; class GFG{ // A Binary Tree Nodestatic class node{    int data;    node left, right;}; // A utility function to create a new// Binary Tree nodestatic node newNode(int item){    node temp = new node();    temp.data = item;    temp.left = null;    temp.right = null;    return temp;}static Queue<node> q; // Utility function to print the left view of// the binary treestatic void leftViewUtil( node root ){    if (root == null)        return;     // add root    q.add(root);     // Delimiter    q.add(null);     while (q.size() > 0)    {        node temp = q.peek();         if (temp != null)        {             // Prints first node            // of each level            System.out.print(temp.data + " ");             // add children of all nodes at            // current level            while (q.peek() != null)            {                 // If left child is present                // add into queue                if (temp.left != null)                    q.add(temp.left);                 // If right child is present                // add into queue                if (temp.right != null)                    q.add(temp.right);                 // remove the current node                q.remove();                 temp = q.peek();            }             // add delimiter            // for the next level            q.add(null);        }         // remove the delimiter of        // the previous level        q.remove();    }} // Function to print the leftView// of Binary Treestatic void leftView( node root){    // Queue to store all    // the nodes of the tree    q = new LinkedList<node>();     leftViewUtil(root);} // Driver Codepublic static void main(String args[]){    node root = newNode(10);    root.left = newNode(12);    root.right = newNode(3);    root.left.right = newNode(4);    root.right.left = newNode(5);    root.right.left.right = newNode(6);    root.right.left.right.left = newNode(18);    root.right.left.right.right = newNode(7);     leftView(root);}} // This code is contributed by Arnab Kundu
# Python3 program to print the# left view of Binary Tree # 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        self.hd=0 # Utility function to print the left# view of the binary treedef leftViewUtil(root, q) :     if (root == None) :        return     # append root    q.append(root)     # Delimiter    q.append(None)     while (len(q)):        temp = q[0]         if (temp):             # Prints first node of each level            print(temp.data, end = " ")             # append children of all nodes            # at current level            while (q[0] != None) :                temp = q[0]                                 # If left child is present                # append into queue                if (temp.left) :                    q.append(temp.left)                 # If right child is present                # append into queue                if (temp.right) :                    q.append(temp.right)                 # Pop the current node                q.pop(0)                         # append delimiter            # for the next level            q.append(None)                 # Pop the delimiter of        # the previous level        q.pop(0)     # Function to print the leftView# of Binary Treedef leftView(root):     # Queue to store all    # the nodes of the tree    q = []     leftViewUtil(root, q) # Driver Codeif __name__ == '__main__':     root = newNode(10)    root.left = newNode(12)    root.right = newNode(3)    root.left.right = newNode(4)    root.right.left = newNode(5)    root.right.left.right = newNode(6)    root.right.left.right.left = newNode(18)    root.right.left.right.right = newNode(7)    leftView(root) # This code is contributed by# Shubham Singh(SHUBHAMSINGH10)
// C# program to print the// left view of Binary Treeusing System;using System.Collections.Generic;     class GFG{ // A Binary Tree Nodepublic class node{    public int data;    public node left, right;}; // A utility function to create a new// Binary Tree nodestatic node newNode(int item){    node temp = new node();    temp.data = item;    temp.left = null;    temp.right = null;    return temp;}static Queue<node> q = new Queue<node>(); // Utility function to print the left view of// the binary treestatic void leftViewUtil( node root ){    if (root == null)        return;     // add root    q.Enqueue(root);     // Delimiter    q.Enqueue(null);     while (q.Count > 0)    {        node temp = q.Peek();         if (temp != null)        {             // Prints first node            // of each level            Console.Write(temp.data + " ");             // add children of all nodes at            // current level            while (q.Peek() != null)            {                 // If left child is present                // add into queue                if (temp.left != null)                    q.Enqueue(temp.left);                 // If right child is present                // add into queue                if (temp.right != null)                    q.Enqueue(temp.right);                 // remove the current node                q.Dequeue();                 temp = q.Peek();            }             // add delimiter            // for the next level            q.Enqueue(null);        }         // remove the delimiter of        // the previous level        q.Dequeue();    }} // Function to print the leftView// of Binary Treestatic void leftView( node root){    // Queue to store all    // the nodes of the tree    q = new Queue<node>();     leftViewUtil(root);} // Driver Codepublic static void Main(String []args){    node root = newNode(10);    root.left = newNode(12);    root.right = newNode(3);    root.left.right = newNode(4);    root.right.left = newNode(5);    root.right.left.right = newNode(6);    root.right.left.right.left = newNode(18);    root.right.left.right.right = newNode(7);     leftView(root);}} // This code is contributed by 29AjayKumar
<script>     // JavaScript program to print the left view of Binary Tree         // Binary Tree Node    class node    {        constructor(item) {           this.left = null;           this.right = null;           this.data = item;        }    }         // A utility function to create a new    // Binary Tree node    function newNode(item)    {        let temp = new node(item);        return temp;    }    let q = [];     // Utility function to print the left view of    // the binary tree    function leftViewUtil(root)    {        if (root == null)            return;         // add root        q.push(root);         // Delimiter        q.push(null);         while (q.length > 0)        {            let temp = q[0];             if (temp != null)            {                 // Prints first node                // of each level                document.write(temp.data + " ");                 // add children of all nodes at                // current level                while (q[0] != null)                {                     // If left child is present                    // add into queue                    if (temp.left != null)                        q.push(temp.left);                     // If right child is present                    // add into queue                    if (temp.right != null)                        q.push(temp.right);                     // remove the current node                    q.shift();                     temp = q[0];                }                 // add delimiter                // for the next level                q.push(null);            }             // remove the delimiter of            // the previous level            q.shift();        }    }     // Function to print the leftView    // of Binary Tree    function leftView(root)    {        // Queue to store all        // the nodes of the tree        q = [];         leftViewUtil(root);    }         let root = newNode(10);    root.left = newNode(12);    root.right = newNode(3);    root.left.right = newNode(4);    root.right.left = newNode(5);    root.right.left.right = newNode(6);    root.right.left.right.left = newNode(18);    root.right.left.right.right = newNode(7);       leftView(root); </script>
Output:  
10 12 4 6 18
Time Complexity: O(N) where N is the number of vertices in the binary tree.Auxiliary Space: O(N).   
SHUBHAMSINGH10
andrew1234
29AjayKumar
Akanksha_Rai
mukesh07
pankajsharmagfg
Binary Tree
tree-level-order
Data Structures
Queue
Tree
Data Structures
Queue
Tree
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.