Print the nodes of binary tree as they become the leaf node

Given a binary tree. First print all leaf nodes, after that remove all the leaf nodes from the tree and now print all the new formed leaf nodes and keep doing this until all the nodes are removed from the tree.

Examples :

Input :  
              8
             / \
           3    10
          / \   / \
         1  6  14  4
        / \
       7   13

Output : 
4 6 7 13 14
1 10
3
8

Source :Flipkart On Campus Recruitment



Approach : The idea is to perform simple dfs and assign different values to each node on the basis of following conditions:

  1. Initially assign all the nodes with value as 0.
  2. Now, Assign all the nodes with the value as (maximum value of both child)+1.

Tree before DFS: A temporary value zero is assigned to all of the nodes.
before dfs

Tree after DFS: Nodes are assigned with the value as (maximum value of both child)+1.
after dfs

Now, you can see in the above tree that after all the values are assigned to each node, the task now reduces to print the tree on the basis of increasing order of node values assigned to them.

Below is the implementation of above approach:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program to print the nodes of binary
// tree as they become the leaf node
  
#include <bits/stdc++.h>
using namespace std;
  
// Binary tree node
struct Node {
    int data;
    int order;
    struct Node* left;
    struct Node* right;
};
  
// Utiltiy function to allocate a new node
struct Node* newNode(int data, int order)
{
    struct Node* node = new Node;
    node->data = data;
    node->order = order;
    node->left = NULL;
    node->right = NULL;
  
    return (node);
}
  
// Function for postorder traversal of tree and
// assigning values to nodes
void Postorder(struct Node* node, vector<pair<int, int> >& v)
{
    if (node == NULL)
        return;
  
    /* first recur on left child */
    Postorder(node->left, v);
  
    /* now recur on right child */
    Postorder(node->right, v);
  
    // If current node is leaf node, it's order will be 1
    if (node->right == NULL && node->left == NULL) {
        node->order = 1;
  
        // make pair of assigned value and tree value
        v.push_back(make_pair(node->order, node->data));
    }
    else {
        // otherwise, the order will be:
        // max(left_child_order, right_child_order) + 1
        node->order = max((node->left)->order, (node->right)->order) + 1;
  
        // make pair of assigned value and tree value
        v.push_back(make_pair(node->order, node->data));
    }
}
  
// Function to print leaf nodes in
// the given order
void printLeafNodes(int n, vector<pair<int, int> >& v)
{
    // Sort the vector in increasing order of
    // assigned node values
    sort(v.begin(), v.end());
  
    for (int i = 0; i < n; i++) {
        if (v[i].first == v[i + 1].first)
            cout << v[i].second << " ";
  
        else
            cout << v[i].second << "\n";
    }
}
  
// Driver Code
int main()
{
    struct Node* root = newNode(8, 0);
    root->left = newNode(3, 0);
    root->right = newNode(10, 0);
    root->left->left = newNode(1, 0);
    root->left->right = newNode(6, 0);
    root->right->left = newNode(14, 0);
    root->right->right = newNode(4, 0);
    root->left->left->left = newNode(7, 0);
    root->left->left->right = newNode(13, 0);
  
    int n = 9;
  
    vector<pair<int, int> > v;
  
    Postorder(root, v);
    printLeafNodes(n, v);
  
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program to print the nodes of binary
// tree as they become the leaf node
import java.util.*;
  
class GFG
{
  
// Binary tree node
static class Node
{
    int data;
    int order;
    Node left;
    Node right;
};
  
static class Pair
{
    int first,second;
      
    Pair(int a,int b)
    {
        first = a;
        second = b;
    }
}
  
// Utiltiy function to allocate a new node
static Node newNode(int data, int order)
{
    Node node = new Node();
    node.data = data;
    node.order = order;
    node.left = null;
    node.right = null;
  
    return (node);
}
static Vector<Pair> v = new Vector<Pair>();
  
// Function for postorder traversal of tree and
// assigning values to nodes
static void Postorder(Node node)
{
    if (node == null)
        return;
  
    /* first recur on left child */
    Postorder(node.left);
  
    /* now recur on right child */
    Postorder(node.right);
  
    // If current node is leaf node, it's order will be 1
    if (node.right == null && node.left == null)
    {
        node.order = 1;
  
        // make pair of assigned value and tree value
        v.add(new Pair(node.order, node.data));
    }
    else
    {
        // otherwise, the order will be:
        // max(left_child_order, right_child_order) + 1
        node.order = Math.max((node.left).order, (node.right).order) + 1;
  
        // make pair of assigned value and tree value
        v.add(new Pair(node.order, node.data));
    }
}
static class Sort implements Comparator<Pair> 
    // Used for sorting in ascending order of 
    // roll number 
    public int compare(Pair a, Pair b) 
    
        if(a.first != b.first)
        return (a.first - b.first);
        else
        return (a.second-b.second);
    
}
  
// Function to print leaf nodes in
// the given order
static void printLeafNodes(int n)
{
    // Sort the vector in increasing order of
    // assigned node values
    Collections.sort(v,new Sort());
    for (int i = 0; i < v.size(); i++) 
    {
        if (i != v.size()-1 && v.get(i).first == v.get(i + 1).first)
            System.out.print( v.get(i).second + " ");
  
        else
            System.out.print( v.get(i).second + "\n");
    }
}
  
  
// Driver Code
public static void main(String args[])
{
    Node root = newNode(8, 0);
    root.left = newNode(3, 0);
    root.right = newNode(10, 0);
    root.left.left = newNode(1, 0);
    root.left.right = newNode(6, 0);
    root.right.left = newNode(14, 0);
    root.right.right = newNode(4, 0);
    root.left.left.left = newNode(7, 0);
    root.left.left.right = newNode(13, 0);
  
    int n = 9;
  
    Postorder(root);
    printLeafNodes(n);
}
}
  
// This code is contributed by Arnab Kundu

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 program to print the nodes of binary
# tree as they become the leaf node
  
# Binary tree node 
class newNode: 
      
    def __init__(self, data,order): 
        self.data = data 
        self.order=order
        self.left = None
        self.right = None
  
# Function for postorder traversal of tree and
# assigning values to nodes
def Postorder(node,v):
    if (node == None):
        return
      
    """ first recur on left child """
    Postorder(node.left, v)
      
    """ now recur on right child """
    Postorder(node.right, v)
      
    # If current node is leaf node, 
    # it's order will be 1
    if (node.right == None and 
        node.left == None):
        node.order = 1
          
        # make pair of assigned value and tree value
        v[0].append([node.order, node.data])
      
    else:
          
        # otherwise, the order will be:
        # max(left_child_order, right_child_order) + 1
        node.order = max((node.left).order, 
                         (node.right).order) + 1
          
        # make pair of assigned value and tree value
        v[0].append([node.order, node.data])
          
# Function to print leaf nodes in
# the given order
def printLeafNodes(n, v):
      
    # Sort the vector in increasing order of
    # assigned node values
    v=sorted(v[0])
    for i in range(n - 1):
        if (v[i][0]== v[i + 1][0]):
            print(v[i][1], end = " ")
        else:
            print(v[i][1])
    if (v[-1][0]== v[-2][0]):
            print(v[-1][1], end = " ")
    else:
        print(v[-1][1])
      
# Driver Code
root = newNode(8, 0)
root.left = newNode(3, 0)
root.right = newNode(10, 0)
root.left.left = newNode(1, 0)
root.left.right = newNode(6, 0)
root.right.left = newNode(14, 0)
root.right.right = newNode(4, 0)
root.left.left.left = newNode(7, 0)
root.left.left.right = newNode(13, 0)
  
n = 9
v = [[] for i in range(1)]
  
Postorder(root, v)
printLeafNodes(n, v)
  
# This code is contributed by SHUBHAMSINGH10

chevron_right


Output:

4 6 7 13 14
1 10
3
8

Time Complexity : O(nlogn)
Auxiliary Space : O(n), where n is the number of nodes in the given Binary Tree.



My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.