Given a binary tree, the task is to find the bottom view of a binary tree using recursion.
Examples:
Input: 1 \ 2 \ 4 / \ 3 5 Output: 1 3 4 5 Input: 20 / \ 8 22 / \ / \ 5 10 21 25 / \ 9 14 Output: 5 9 21 14 25
Approach:
We can do so by using recursion and 2 arrays each with size 2n+1(for worst case), where n = number of elements in the given tree. Here, we take a Variable x which determines its Horizontal Distance. Let x is the horizontal distance of a Node. Now, the left child will have a horizontal distance of x-1(x minus 1)and the right child will have horizontal distance x+1(x plus 1). Take another Variable ‘p’ as a priority which will decide which level this element belongs to.
1 (x=0, p=0) \ 2 (x=1, p=1) \ 4 (x=2, p=2) / \ (x=1, p=3) 3 5 (x=3, p=3)
While Traversing the Tree In fashion Right-> Node-> Left, assign x and p to each Node and simultaneously insert the data of node in the first array if the array is empty at position (mid+x). If the array is not empty and a Node with higher Priority( p ) comes to update the array with the data of this Node as position(mid+x). The second array will be maintaining the priority( p ) of each inserted node in the first array check code for better understanding.
Below is the implementation of above approach:Â Â
C++
#include <bits/stdc++.h> using namespace std; Â
struct Node {     int data;     // left and right references     Node *left, *right;     // Constructor of tree Node     Node( int key)     {         data = key;         left = right = NULL;     } }; Â
int l = 0, r = 0; int N; Â
// Function to generate bottom view of binary tree void Bottom(Node* root, int arr[], int arr2[], int x, int p,             int mid) {     // Base case     if (root == NULL)         return ;     // To store leftmost value of x in l Â
    if (x < l)         l = x; Â
    // To store rightmost value of x in r     if (x > r)         r = x; Â
    // To check if arr is empty at mid+x     if (arr[mid + x] == INT_MIN) {         // Insert data of Node at arr[mid+x]         arr[mid + x] = root->data;         // Insert priority of that Node at arr2[mid+x]         arr2[mid + x] = p;     } Â
    // If not empty and priotiy of previously inserted Node     // is less than current*/     else if (arr2[mid + x] < p) {         // Insert current Node data at arr[mid+x]         arr[mid + x] = root->data;         // Insert priotiy of that Node at arr2[mid +x]         arr2[mid + x] = p;     } Â
    // Go right first then left     Bottom(root->right, arr, arr2, x + 1, p + 1, mid);     Bottom(root->left, arr, arr2, x - 1, p + 1, mid); } Â
// Utility function to generate bottom view of a biany tree void bottomView( struct Node* root) { Â Â Â Â int arr[2 * N + 1]; Â Â Â Â int arr2[2 * N + 1]; Â Â Â Â for ( int i = 0; i < 2 * N + 1; i++) { Â Â Â Â Â Â Â Â arr[i] = INT_MIN; Â Â Â Â Â Â Â Â arr2[i] = INT_MIN; Â Â Â Â } Â Â Â Â int mid = N, x = 0, p = 0; Â Â Â Â Bottom(root, arr, arr2, x, p, mid); Â Â Â Â for ( int i = mid + l; i <= mid + r; i++) Â Â Â Â Â Â Â Â cout << arr[i] << " " ; } Â
// Driver code int main() { Â
    N = 5;     Node* root = new Node(1);     root->right = new Node(2);     root->right->right = new Node(4);     root->right->right->left = new Node(3);     root->right->right->right = new Node(5); Â
    bottomView(root); Â
    return 0; } Â
// This code is contributed by Sania Kumari Gupta // (kriSania804) |
C
#include <limits.h> #include <stdio.h> #include <stdlib.h> Â
typedef struct Node { Â Â Â Â int data; Â Â Â Â struct Node *left, *right; } Node; Â
/* Helper function that allocates a new node with the    given data and NULL left and right pointers. */ Node* newNode( int data) {     Node* new_node = (Node*) malloc ( sizeof (Node));     new_node->data = data;     new_node->left = new_node->right = NULL;     return new_node; } Â
int l = 0, r = 0; int N; Â
// Function to generate bottom view of binary tree void Bottom(Node* root, int arr[], int arr2[], int x, int p,             int mid) {     // Base case     if (root == NULL)         return ;     // To store leftmost value of x in l     if (x < l)         l = x;     // To store rightmost value of x in r     if (x > r)         r = x;     // To check if arr is empty at mid+x     if (arr[mid + x] == INT_MIN) {         // Insert data of Node at arr[mid+x]         arr[mid + x] = root->data;         // Insert priority of that Node at arr2[mid+x]         arr2[mid + x] = p;     } Â
    // If not empty and priotiy of previously inserted Node     // is less than current*/     else if (arr2[mid + x] < p) {         // Insert current Node data at arr[mid+x]         arr[mid + x] = root->data;         // Insert priotiy of that Node at arr2[mid +x]         arr2[mid + x] = p;     } Â
    // Go right first then left     Bottom(root->right, arr, arr2, x + 1, p + 1, mid);     Bottom(root->left, arr, arr2, x - 1, p + 1, mid); } Â
// Utility function to generate bottom view of a biany tree void bottomView( struct Node* root) { Â Â Â Â int arr[2 * N + 1]; Â Â Â Â int arr2[2 * N + 1]; Â Â Â Â for ( int i = 0; i < 2 * N + 1; i++) { Â Â Â Â Â Â Â Â arr[i] = INT_MIN; Â Â Â Â Â Â Â Â arr2[i] = INT_MIN; Â Â Â Â } Â Â Â Â int mid = N, x = 0, p = 0; Â Â Â Â Bottom(root, arr, arr2, x, p, mid); Â Â Â Â for ( int i = mid + l; i <= mid + r; i++) Â Â Â Â Â Â Â Â printf ( "%d " , arr[i]); } Â
// Driver code int main() { Â
    N = 5;     Node* root = newNode(1);     root->right = newNode(2);     root->right->right = newNode(4);     root->right->right->left = newNode(3);     root->right->right->right = newNode(5); Â
    bottomView(root); Â
    return 0; } Â
// This code is contributed by Sania Kumari Gupta // (kriSania804) |
Java
class GFG {     static class Node {         int data;         // left and right references         Node left, right;         // Constructor of tree Node         public Node( int key)         {             data = key;             left = right = null ;         }     }; Â
    static int l = 0 , r = 0 , N; Â
    // Function to generate bottom view of binary tree     static void Bottom(Node root, int arr[], int arr2[],                        int x, int p, int mid)     {         // Base case         if (root == null )             return ;         // To store leftmost value of x in l         if (x < l)             l = x;         // To store rightmost value of x in r         if (x > r)             r = x;         // To check if arr is empty at mid+x         if (arr[mid + x] == Integer.MIN_VALUE) {             // Insert data of Node at arr[mid+x]             arr[mid + x] = root.data;             // Insert priority of that Node at arr2[mid+x]             arr2[mid + x] = p;         } Â
        // If not empty and priotiy of previously inserted         // Node is less than current         else if (arr2[mid + x] < p) { Â
            // Insert current Node data at arr[mid+x]             arr[mid + x] = root.data; Â
            // Insert priotiy of that Node at arr2[mid +x]             arr2[mid + x] = p;         } Â
        // Go right first then left         Bottom(root.right, arr, arr2, x + 1 , p + 1 , mid);         Bottom(root.left, arr, arr2, x - 1 , p + 1 , mid);     } Â
    // Utility function to generate bottom view of a biany     // tree     static void bottomView(Node root)     {         int [] arr = new int [ 2 * N + 1 ];         int [] arr2 = new int [ 2 * N + 1 ]; Â
        for ( int i = 0 ; i < 2 * N + 1 ; i++) {             arr[i] = Integer.MIN_VALUE;             arr2[i] = Integer.MIN_VALUE;         }         int mid = N, x = 0 , p = 0 ;         Bottom(root, arr, arr2, x, p, mid);         for ( int i = mid + l; i <= mid + r; i++)             System.out.print(arr[i] + " " );     } Â
    // Driver code     public static void main(String[] args)     {         N = 5 ; Â
        Node root = new Node( 1 );         root.right = new Node( 2 );         root.right.right = new Node( 4 );         root.right.right.left = new Node( 3 );         root.right.right.right = new Node( 5 ); Â
        bottomView(root);     } } Â
// This code is contributed by Sania Kumari Gupta // (kriSania804) |
Python3
class Node:     def __init__( self , data):         self .data = data         self .left = None         self .right = None Â
l = 0 r = 0 INT_MIN = - ( 2 * * 32 ) Â
# Function to generate # bottom view of # binary tree def Bottom(root, arr, arr2, x, p, mid):     global INT_MIN, l, r          # Base case     if (root = = None ):         return          if (x < l):                  # To store leftmost         # value of x in l         l = x          # To store rightmost     # value of x in r     if (x > r):         r = x              # To check if arr     # is empty at mid+x     if (arr[mid + x] = = INT_MIN): Â
        # Insert data of Node         # at arr[mid+x]         arr[mid + x] = root.data Â
        # Insert priority of         # that Node at arr2[mid+x]         arr2[mid + x] = p              # If not empty and priotiy     # of previously inserted     # Node is less than current*/     elif (arr2[mid + x] < p): Â
        # Insert current         # Node data at arr[mid+x]         arr[mid + x] = root.data                  # Insert priotiy of         # that Node at arr2[mid +x]         arr2[mid + x] = p          # Go right first     # then left     Bottom(root.right, arr, arr2, x + 1 , p + 1 , mid)     Bottom(root.left, arr, arr2, x - 1 , p + 1 , mid) Â
# Utility function # to generate bottom # view of a biany tree def bottomView(root): Â Â Â Â global INT_MIN Â Â Â Â arr = [ 0 ] * ( 2 * N + 1 ) Â Â Â Â arr2 = [ 0 ] * ( 2 * N + 1 ) Â Â Â Â Â Â Â Â Â for i in range ( 2 * N + 1 ): Â Â Â Â Â Â Â Â arr[i] = INT_MIN Â Â Â Â Â Â Â Â arr2[i] = INT_MIN Â Â Â Â mid = N Â Â Â Â x = 0 Â Â Â Â p = 0 Â Â Â Â Bottom(root, arr, arr2, x, p, mid) Â Â Â Â Â Â Â Â Â for i in range (mid + l,mid + r + 1 ): Â Â Â Â Â Â Â Â print (arr[i], end = " " ) Â Â Â Â Â Â Â Â Â # Driver code N = 5 root = Node( 1 ) root.right = Node( 2 ) root.right.right = Node( 4 ) root.right.right.left = Node( 3 ) root.right.right.right = Node( 5 ) Â
bottomView(root) Â Â Â Â Â # This code is contributed by SHUBHAMSINGH10 |
C#
using System; Â
class GFG{ Â Â Â Â Â class Node{ Â Â Â Â Â public int data; Â
// left and right references public Node left, right; Â
// Constructor of tree Node public Node( int key) { Â Â Â Â data = key; Â Â Â Â left = right = null ; } }; Â
static int l = 0, r = 0, N; Â
// Function to generate // bottom view of binary tree static void Bottom(Node root, int []arr,                   int []arr2, int x,                        int p, int mid) {          // Base case     if (root == null )     {         return ;     } Â
    if (x < l)     {                  // To store leftmost         // value of x in l         l = x;     } Â
    // To store rightmost     // value of x in r     if (x > r)     {         r = x;     } Â
    // To check if arr     // is empty at mid+x     if (arr[mid + x] == Int32.MinValue)     {                  // Insert data of Node         // at arr[mid+x]         arr[mid + x] = root.data;                  // Insert priority of         // that Node at arr2[mid+x]         arr2[mid + x] = p;     } Â
    // If not empty and priotiy     // of previously inserted     // Node is less than current*/     else if (arr2[mid + x] < p)     {                  // Insert current         // Node data at arr[mid+x]         arr[mid + x] = root.data; Â
        // Insert priotiy of         // that Node at arr2[mid +x]         arr2[mid + x] = p;     } Â
    // Go right first     // then left     Bottom(root.right, arr, arr2,            x + 1, p + 1, mid);     Bottom(root.left, arr, arr2,            x - 1, p + 1, mid); } Â
// Utility function to generate // bottom view of a biany tree static void bottomView(Node root) { Â Â Â Â int [] arr = new int [2 * N + 1]; Â Â Â Â int [] arr2 = new int [2 * N + 1]; Â
    for ( int i = 0; i < 2 * N + 1; i++)     {         arr[i] = Int32.MinValue;         arr2[i] = Int32.MinValue;     } Â
    int mid = N, x = 0, p = 0; Â
    Bottom(root, arr, arr2, x, p, mid); Â
    for ( int i = mid + l; i <= mid + r; i++)     {         Console.Write(arr[i] + " " );     } } Â
// Driver code public static void Main( string [] args) { Â Â Â Â N = 5; Â Â Â Â Â Â Â Â Â Node root = new Node(1); Â Â Â Â root.right = new Node(2); Â Â Â Â root.right.right = new Node(4); Â Â Â Â root.right.right.left = new Node(3); Â Â Â Â root.right.right.right = new Node(5); Â
    bottomView(root); } } Â
// This code is contributed by rutvik_56 |
Javascript
<script> Â
class Node{ Â
    // Constructor of tree Node     constructor(key)     {         this .data = key;         this .left = null ;         this .right = null ;     } Â
}; Â
var l = 0, r = 0, N; Â
// Function to generate // bottom view of binary tree function Bottom(root, arr, arr2, x, p, mid) {          // Base case     if (root == null )     {         return ;     } Â
    if (x < l)     {                  // To store leftmost         // value of x in l         l = x;     } Â
    // To store rightmost     // value of x in r     if (x > r)     {         r = x;     } Â
    // To check if arr     // is empty at mid+x     if (arr[mid + x] == -1000000000)     {                  // Insert data of Node         // at arr[mid+x]         arr[mid + x] = root.data;                  // Insert priority of         // that Node at arr2[mid+x]         arr2[mid + x] = p;     } Â
    // If not empty and priotiy     // of previously inserted     // Node is less than current*/     else if (arr2[mid + x] < p)     {                  // Insert current         // Node data at arr[mid+x]         arr[mid + x] = root.data; Â
        // Insert priotiy of         // that Node at arr2[mid +x]         arr2[mid + x] = p;     } Â
    // Go right first     // then left     Bottom(root.right, arr, arr2,            x + 1, p + 1, mid);     Bottom(root.left, arr, arr2,            x - 1, p + 1, mid); } Â
// Utility function to generate // bottom view of a biany tree function bottomView(root) { Â Â Â Â var arr = Array(2*N +1).fill(-1000000000); Â Â Â Â var arr2 = Array(2*N +1).fill(-1000000000); Â Â Â Â Â Â Â var mid = N, x = 0, p = 0; Â
    Bottom(root, arr, arr2, x, p, mid); Â
    for ( var i = mid + l; i <= mid + r; i++)     {         document.write(arr[i] + " " );     } } Â
// Driver code N = 5; Â
var root = new Node(1); root.right = new Node(2); root.right.right = new Node(4); root.right.right.left = new Node(3); root.right.right.right = new Node(5); bottomView(root); Â
</script> |
1 3 4 5
Â
Time Complexity: O(N) where N is number of nodes in a given binary tree
Auxiliary space: O(n) for implicit call stack as using recursion
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!