Open In App

Left View of a Binary Tree

Last Updated : 02 May, 2025
Comments
Improve
Suggest changes
Like Article
Like
Report

Given a Binary Tree, the task is to print the left view of the Binary Tree. The left view of a Binary Tree is a set of leftmost nodes for every level.

Examples:

Input: root[] = [1, 2, 3, 4, 5, N, N]

Output: [1, 2, 4]
Explanation: From the left side of the tree, only the nodes 1, 2, and 4 are visible.

Input: root[] = [1, 2, 3, N, N, 4, N, N, 5, N, N]

Output: [1, 2, 4, 5]
Explanation: From the left side of the tree, the nodes 1, 2, 4, and 5 are visible.

[Approach – 1] Using Depth-first search (DFS) – O(n) Time and O(n) Space

Imagine standing to the left side of a tree and looking straight at it. The nodes you see first at each level from top to bottom make up the “left view.” The code captures this by exploring the tree level by level, always moving left before right.

When we go down a level, we check if it’s deeper than what we’ve seen before. If yes, it means this is the first (leftmost) node visible at that level, so we add it to our result. By prioritizing the left subtree in recursion, we ensure we pick the correct leftmost nodes naturally.

We’re finding the first visible node at each level when viewing the binary tree from the left side. By recursively traversing left branches first and tracking depth levels, we record each level’s leftmost node before moving right. This gives us the exact nodes that form the tree’s left-edge silhouette.

C++
#include <iostream>
#include <vector>
using namespace std;

class Node {
public:
    int data;
    Node *left, *right;

    Node(int val) : data(val), left(nullptr), right(nullptr) {}
};

// Helper function to get left view nodes
void getLeftView(Node* root, int currentLevel, int& maxLevel, vector<int>& result) {
    if (!root) return;
    
    // If this is the first node of its level, add to result
    if (currentLevel > maxLevel) {
        result.push_back(root->data);
        maxLevel = currentLevel;
    }
    
    // Process left subtree first to ensure left view preference
    getLeftView(root->left, currentLevel + 1, maxLevel, result);
    getLeftView(root->right, currentLevel + 1, maxLevel, result);
}

// Main function to initiate left view traversal
vector<int> leftView(Node* root) {
    vector<int> result;
    int maxLevel = -1;
    getLeftView(root, 0, maxLevel, result);
    return result;
}

int 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);

    vector<int> view = leftView(root);
    
    for (int val : view) {
        cout << val << " ";
    }
    cout << endl;
    
    return 0;
}
Java
import java.util.ArrayList;

class Node {
    int data;
    Node left, right;

    Node(int x) {
        data = x;
        left = right = null;
    }
}

class GfG {
    private static void recLeftView(Node root, int level, ArrayList<Integer> result) {
        if (root == null) return;
        
        if (level == result.size()) {
            result.add(root.data);
        }
        
        recLeftView(root.left, level + 1, result);
        recLeftView(root.right, level + 1, result);
    }

    public static ArrayList<Integer> leftView(Node root) {
        ArrayList<Integer> result = new ArrayList<>();
        recLeftView(root, 0, result);
        return result;
    }

    public 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);

        ArrayList<Integer> view = leftView(root);
        for (int val : view) {
            System.out.print(val + " ");
        }
        System.out.println();
    }
}
Python
class Node:
    def __init__(self, x):
        self.data = x
        self.left = None
        self.right = None

def recLeftView(root, level, result):
    if root is None:
        return
    
    if level == len(result):
        result.append(root.data)
    
    recLeftView(root.left, level + 1, result)
    recLeftView(root.right, level + 1, result)

def leftView(root):
    result = []
    recLeftView(root, 0, result)
    return result

# Main function
if __name__ == "__main__":
    root = Node(1)
    root.left = Node(2)
    root.right = Node(3)
    root.left.left = Node(4)
    root.left.right = Node(5)

    result = leftView(root)
    print(' '.join(map(str, result)))  # Output: 1 2 4
C#
using System;
using System.Collections.Generic;

class Node {
    public int data;
    public Node left, right;

    public Node(int x) {
        data = x;
        left = right = null;
    }
}

class GfG {
    private static void recLeftView(Node root, int level, List<int> result) {
        if (root == null) return;
        
        if (level == result.Count) {
            result.Add(root.data);
        }
        
        recLeftView(root.left, level + 1, result);
        recLeftView(root.right, level + 1, result);
    }

    public static List<int> leftView(Node root) {
        List<int> result = new List<int>();
        recLeftView(root, 0, result);
        return result;
    }

    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);

        List<int> view = leftView(root);
        foreach (int val in view) {
            Console.Write(val + " ");
        }
        Console.WriteLine();
    }
}
JavaScript
class Node {
    constructor(x) {
        this.data = x;
        this.left = null;
        this.right = null;
    }
}

function recLeftView(root, level, result) {
    if (root === null) return;
    
    if (level === result.length) {
        result.push(root.data);
    }
    
    recLeftView(root.left, level + 1, result);
    recLeftView(root.right, level + 1, result);
}

function leftView(root) {
    const result = [];
    recLeftView(root, 0, result);
    return result;
}

// Main function
const 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);

const result = leftView(root);
console.log(result.join(' '));  // Output: 1 2 4

Output
1 2 4 

Time Complexity: O(n), The function does a simple traversal of the tree, so the complexity is O(n). 
Auxiliary Space: O(h), due to the stack space during recursive call. ‘h‘ here is the height of the binary tree.

[Approach – 2] Using Level Order Traversal (BFS) – O(n) Time and O(n) Space

The left view contains all nodes that are the first nodes in their levels. A simple solution is to do level order traversal and print the first node in every level. 

Step-by-Step implementation

  • Check if the root is missing/null, and return an empty result if it is.
  • Initialize a queue and push the root node to start level order traversal.
  • For every level, process all nodes and store the first node’s data into the result array.
  • Push the left and right children of the current node into the queue if they exist.
  • After traversal is done, print the left view of the tree.
C++
// C++ program to print left view of Binary
// tree using Level order Traversal
#include <bits/stdc++.h>
using namespace std;

class Node {
public:
    int data;
    Node* left;
    Node* right;

    Node(int x) {
        data = x;
        left = right = nullptr;
    }
};

// Function to return the left view of the binary tree
vector<int> leftView(Node* root) {
    vector<int> result;

    if (root == nullptr) return result;

    // Queue for level order traversal
    queue<Node*> q;
    q.push(root);

    while (!q.empty()) {
      
        // Number of nodes at current level
        int levelSize = q.size();

        for (int i = 0; i < levelSize; i++) {
            Node* curr = q.front();
            q.pop();

            // If it's the first node of the current level
            if (i == 0) {
                result.push_back(curr->data);
            }

            // Enqueue left child
            if (curr->left != nullptr) {
                q.push(curr->left);
            }

            // Enqueue right child
            if (curr->right != nullptr) {
                q.push(curr->right);
            }
        }
    }

    return result;
}


int 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);

    vector<int> result = leftView(root);
    for (int val : result) {
        cout << val << " ";
    }
    cout << endl;   
    return 0;
}
Java
// Java program to print left view of Binary
// tree using Level order Traversal
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;

class Node {
    int data;
    Node left, right;

    Node(int x) {
        data = x;
        left = right = null;
    }
}

class GfG {

    // Function to return the left view of the binary tree
    static ArrayList<Integer> leftView(Node root) {
        ArrayList<Integer> result = new ArrayList<>();
        
        if (root == null) {
            return result;
        }

        // Queue for level order traversal
        Queue<Node> q = new LinkedList<>();
        q.add(root);

        while (!q.isEmpty()) {
          
            // Number of nodes at the current level
            int levelSize = q.size();

            for (int i = 0; i < levelSize; i++) {
                Node curr = q.poll();

                // If it's the first node of the current level
                if (i == 0) {
                    result.add(curr.data);
                }

                // Enqueue left child
                if (curr.left != null) {
                    q.add(curr.left);
                }

                // Enqueue right child
                if (curr.right != null) {
                    q.add(curr.right);
                }
            }
        }

        return result;
    }

    public 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);

        ArrayList<Integer> result = leftView(root);

        for (int val : result) {
            System.out.print(val + " ");
        }
        System.out.println();
    }
}
Python
# Python program to print left view of Binary Tree
# using Level Order Traversal
from collections import deque

class Node:
    def __init__(self, data):
        self.data = data
        self.left = None
        self.right = None

# Function to return the left view of the binary tree
def LeftView(root):
    result = []
    
    if root is None:
        return result

    # Queue for level order traversal
    q = deque([root])

    while q:
      
        # Number of nodes at the current level
        level_size = len(q)

        for i in range(level_size):
            curr = q.popleft()

            # If it's the first node of the 
            # current level
            if i == 0:
                result.append(curr.data)

            # Enqueue left child
            if curr.left is not None:
                q.append(curr.left)

            # Enqueue right child
            if curr.right is not None:
                q.append(curr.right)

    return result


if __name__ == "__main__":
    
     
    root = Node(1)
    root.left = Node(2)
    root.right = Node(3)
    root.left.left = Node(4)
    root.left.right = Node(5)

    result = LeftView(root)
    for val in result:
        print(val, end=" ")
    print()
C#
// C# program to print left view of Binary
// Tree using Level Order Traversal
using System;
using System.Collections.Generic;

class Node {
    public int data;
    public Node left, right;

    public Node(int x) {
        data = x;
        left = right = null;
    }
}

class GfG {
  
    // Function to return the left view of 
    // the binary tree
    static List<int> LeftView(Node root) {
        List<int> result = new List<int>();

        if (root == null) {
            return result;
        }

        // Queue for level order traversal
        Queue<Node> queue = new Queue<Node>();
        queue.Enqueue(root);

        while (queue.Count > 0) {
          
            // Number of nodes at the current level
            int levelSize = queue.Count;

            for (int i = 0; i < levelSize; i++) {
                Node curr = queue.Dequeue();

                // If it's the first node of 
                // the current level
                if (i == 0) {
                    result.Add(curr.data);
                }

                // Enqueue left child
                if (curr.left != null) {
                    queue.Enqueue(curr.left);
                }

                // Enqueue right child
                if (curr.right != null) {
                    queue.Enqueue(curr.right);
                }
            }
        }

        return result;
    }


    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);

        List<int> result = LeftView(root);
        foreach (int val in result) {
            Console.Write(val + " ");
        }
        Console.WriteLine();
    }
}
JavaScript
// Javascript program to print left view of Binary
// tree using Level order Traversal

class Node {
    constructor(data) {
        this.data = data;
        this.left = null;
        this.right = null;
    }
}

// Function to return the left view of the binary tree
function leftView(root) {
    let result = [];

    if (root === null) {
        return result;
    }

    // Queue for level order traversal
    let queue = [root];

    while (queue.length > 0) {
    
    	// Temporary array for the next level
        let currqueue = []; 

        // Number of nodes at the current level
        let levelSize = queue.length;

        for (let i = 0; i < levelSize; i++) {
            let curr = queue[i];

            // If it's the first node of the current level
            if (i === 0) {
                result.push(curr.data);
            }

            // Enqueue left child
            if (curr.left !== null) {
                currqueue.push(curr.left);
            }

            // Enqueue right child
            if (curr.right !== null) {
                currqueue.push(curr.right);
            }
        }
        // Move to the next level
        queue = currqueue;
    }

    return result;
}

//Driver code
let 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);

let result = leftView(root);
console.log(result.join(' '));

Output
1 2 4 

Time Complexity: O(n), where n is the number of nodes in the binary tree.
Auxiliary Space: O(n)
Related article:



Next Article

Similar Reads