Recursive Program to Print extreme nodes of each level of Binary Tree in alternate order

Given a binary tree, the task is to print nodes of extreme corners of each level but in alternate order.

Examples:

Input : 
         1
        /  \
       2    3
      /    /  \
     4    5    6
    /    / \
   7    8   9
Output : 1 2 6 7
Print the rightmost node at 1st level: 1
Print the leftmost node at 2nd level: 2
Print the rightmost node at 3rd level: 6
Print the leftmost node at 4th level: 7
Other possible output will be -> 1 3 4 9

Input :
        3 
       /  \
      8    1
     / \  / \
    9  5 6   4
Output : 3 8 4

We have already discussed the iterative approach to solve this problem. In this post the recursive approach is discussed.

Approach: The idea is to perform level order traversal in the spiral form and at each level print the first node during the traversal, these will be the nodes at extreme corner present in the alternate form.

Below is the implementation of the above approach:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program to print nodes of extreme corners
// of each level in alternate order
  
#include <bits/stdc++.h>
using namespace std;
  
// A binary tree node
struct Node {
    int data;
    Node *left, *right;
};
  
// Utility function to allocate memory for a new node
Node* newNode(int data)
{
    Node* node = new (Node);
    node->data = data;
    node->left = node->right = NULL;
    return (node);
}
  
// Function that returns the height of the binary tree
int height(Node* root)
{
    if (root == NULL)
        return 0;
  
    int lheight = height(root->left);
    int rheight = height(root->right);
  
    return max(lheight, rheight) + 1;
}
  
// Function performs level order traversal from right to
// left and prints the first node during the traversal
void rightToLeft(Node* root, int level, int& f)
{
    if (root == NULL)
        return;
  
    // Checks for the value of f so that
    // only first node is printed during
    // the traversal and no other node is printed
    if (level == 1 && f == 0) {
        printf("%d ", root->data);
        f = 1;
    }
  
    else if (level > 1) {
        rightToLeft(root->right, level - 1, f);
        rightToLeft(root->left, level - 1, f);
    }
}
  
// Function performs level order traversal from left to
// right and prints the first node during the traversal
void leftToRight(Node* root, int level, int& f)
{
    if (root == NULL)
        return;
  
    // Checks for the value of f so that
    // only first node is printed during
    // the traversal and no other node is printed
    if (level == 1 && f == 1) {
        printf("%d ", root->data);
        f = 0;
    }
  
    else if (level > 1) {
        leftToRight(root->left, level - 1, f);
        leftToRight(root->right, level - 1, f);
    }
}
  
// Function to print the extreme nodes of
// a given binary tree
void printExtremeNodes(Node* root)
{
    // Stores height of binary tree
    int h = height(root);
  
    // Flag to mark the change in level
    int flag = 0;
  
    // To check if the extreme node of a
    // particular level has been visited
    int f = 0;
  
    for (int i = 1; i <= h; i++) {
        // If flag is zero then traverse from
        // right to left at the given level and
        // print the first node during the traversal
        if (flag == 0) {
            rightToLeft(root, i, f);
            flag = 1;
        }
  
        // If flag is one then traverse from
        // left to right at the given level and
        // print the first node during the traversal
        else if (flag == 1) {
            leftToRight(root, i, f);
            flag = 0;
        }
    }
  
    return;
}
  
// Driver code
int main()
{
    Node* root = newNode(1);
  
    root->left = newNode(2);
    root->right = newNode(3);
  
    root->left->left = newNode(4);
    root->left->right = newNode(5);
    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->right->left = newNode(14);
    root->right->right->right = newNode(15);
  
    root->left->left->left->left = newNode(16);
    root->left->left->left->right = newNode(17);
    root->right->right->right->right = newNode(31);
  
    printExtremeNodes(root);
  
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program to print nodes of extreme corners 
// of each level in alternate order 
import java.util.*;
  
class GFG
{
      
//INT class
static class INT
{
    int a;
}
  
// A binary tree node 
static class Node 
    int data; 
    Node left, right; 
}; 
  
// Utility function to allocate memory for a new node 
static Node newNode(int data) 
    Node node = new Node(); 
    node.data = data; 
    node.left = node.right = null
    return (node); 
  
// Function that returns the height of the binary tree 
static int height(Node root) 
    if (root == null
        return 0
  
    int lheight = height(root.left); 
    int rheight = height(root.right); 
  
    return Math.max(lheight, rheight) + 1
  
// Function performs level order traversal from right to 
// left and prints the first node during the traversal 
static void rightToLeft(Node root, int level, INT f) 
    if (root == null
        return
  
    // Checks for the value of f so that 
    // only first node is printed during 
    // the traversal and no other node is printed 
    if (level == 1 && f.a == 0
    
        System.out.printf("%d ", root.data); 
        f.a = 1
    
  
    else if (level > 1
    
        rightToLeft(root.right, level - 1, f); 
        rightToLeft(root.left, level - 1, f); 
    
  
// Function performs level order traversal from left to 
// right and prints the first node during the traversal 
static void leftToRight(Node root, int level, INT f) 
    if (root == null
        return
  
    // Checks for the value of f so that 
    // only first node is printed during 
    // the traversal and no other node is printed 
    if (level == 1 && f.a == 1
    
        System.out.printf("%d ", root.data); 
        f.a = 0
    
  
    else if (level > 1)
    
        leftToRight(root.left, level - 1, f); 
        leftToRight(root.right, level - 1, f); 
    
  
// Function to print the extreme nodes of 
// a given binary tree 
static void printExtremeNodes(Node root) 
    // Stores height of binary tree 
    int h = height(root); 
  
    // Flag to mark the change in level 
    int flag = 0
  
    // To check if the extreme node of a 
    // particular level has been visited 
    INT f=new INT();
    f.a = 0
  
    for (int i = 1; i <= h; i++) 
    
        // If flag is zero then traverse from 
        // right to left at the given level and 
        // print the first node during the traversal 
        if (flag == 0)
        
            rightToLeft(root, i, f); 
            flag = 1
        
  
        // If flag is one then traverse from 
        // left to right at the given level and 
        // print the first node during the traversal 
        else if (flag == 1
        
            leftToRight(root, i, f); 
            flag = 0
        
    
  
    return
  
// Driver code 
public static void main(String args[])
    Node root = newNode(1); 
  
    root.left = newNode(2); 
    root.right = newNode(3); 
  
    root.left.left = newNode(4); 
    root.left.right = newNode(5); 
    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.right.left = newNode(14); 
    root.right.right.right = newNode(15); 
  
    root.left.left.left.left = newNode(16); 
    root.left.left.left.right = newNode(17); 
    root.right.right.right.right = newNode(31); 
  
    printExtremeNodes(root); 
  
}
  
// This code is contributed by Arnab Kundu

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# program to print nodes of extreme corners 
// of each level in alternate order 
using System;
  
class GFG
{
      
//INT class
public class INT
{
    public int a;
}
  
// A binary tree node 
public class Node 
    public int data; 
    public Node left, right; 
}; 
  
// Utility function to allocate memory for a new node 
static Node newNode(int data) 
    Node node = new Node(); 
    node.data = data; 
    node.left = node.right = null
    return (node); 
  
// Function that returns the height of the binary tree 
static int height(Node root) 
    if (root == null
        return 0; 
  
    int lheight = height(root.left); 
    int rheight = height(root.right); 
  
    return Math.Max(lheight, rheight) + 1; 
  
// Function performs level order traversal from right to 
// left and prints the first node during the traversal 
static void rightToLeft(Node root, int level, INT f) 
    if (root == null
        return
  
    // Checks for the value of f so that 
    // only first node is printed during 
    // the traversal and no other node is printed 
    if (level == 1 && f.a == 0) 
    
        Console.Write("{0} ", root.data); 
        f.a = 1; 
    
  
    else if (level > 1) 
    
        rightToLeft(root.right, level - 1, f); 
        rightToLeft(root.left, level - 1, f); 
    
  
// Function performs level order traversal from left to 
// right and prints the first node during the traversal 
static void leftToRight(Node root, int level, INT f) 
    if (root == null
        return
  
    // Checks for the value of f so that 
    // only first node is printed during 
    // the traversal and no other node is printed 
    if (level == 1 && f.a == 1) 
    
        Console.Write("{0} ", root.data); 
        f.a = 0; 
    
  
    else if (level > 1)
    
        leftToRight(root.left, level - 1, f); 
        leftToRight(root.right, level - 1, f); 
    
  
// Function to print the extreme nodes of 
// a given binary tree 
static void printExtremeNodes(Node root) 
    // Stores height of binary tree 
    int h = height(root); 
  
    // Flag to mark the change in level 
    int flag = 0; 
  
    // To check if the extreme node of a 
    // particular level has been visited 
    INT f=new INT();
    f.a = 0; 
  
    for (int i = 1; i <= h; i++) 
    
        // If flag is zero then traverse from 
        // right to left at the given level and 
        // print the first node during the traversal 
        if (flag == 0)
        
            rightToLeft(root, i, f); 
            flag = 1; 
        
  
        // If flag is one then traverse from 
        // left to right at the given level and 
        // print the first node during the traversal 
        else if (flag == 1) 
        
            leftToRight(root, i, f); 
            flag = 0; 
        
    
  
    return
  
// Driver code 
public static void Main()
    Node root = newNode(1); 
  
    root.left = newNode(2); 
    root.right = newNode(3); 
  
    root.left.left = newNode(4); 
    root.left.right = newNode(5); 
    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.right.left = newNode(14); 
    root.right.right.right = newNode(15); 
  
    root.left.left.left.left = newNode(16); 
    root.left.left.left.right = newNode(17); 
    root.right.right.right.right = newNode(31); 
  
    printExtremeNodes(root); 
  
}
  
/* This code contributed by PrinciRaj1992 */

chevron_right


Output:

1 2 7 8 31    


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.



Improved By : andrew1234, princiraj1992