Рекурсивная программа для печати крайних узлов каждого уровня двоичного дерева в альтернативном порядке

Опубликовано: 23 Января, 2022

Учитывая двоичное дерево, задача состоит в том, чтобы распечатать узлы крайних углов каждого уровня, но в другом порядке.

Примеры:

Вход : 
         1
        / 
       2 3
      / / 
     4 5 6
    / / 
   7 8 9
Выход: 1 2 6 7
Выведите крайний правый узел 1-го уровня: 1
Выведите крайний левый узел на 2-м уровне: 2
Выведите крайний правый узел на 3-м уровне: 6
Выведите крайний левый узел на 4-м уровне: 7
Другой возможный вывод будет -> 1 3 4 9

Вход :
        3 
       / 
      8 1
     /  / 
    9 5 6 4
Выход: 3 8 4

Рекомендуется: сначала попробуйте свой подход в {IDE}, прежде чем переходить к решению.

Мы уже обсуждали итерационный подход к решению этой проблемы. В этом посте обсуждается рекурсивный подход.

Подход: идея состоит в том, чтобы выполнить обход порядка уровней в спиральной форме и на каждом уровне распечатать первый узел во время обхода, это будут узлы в крайнем углу, присутствующие в альтернативной форме.

Below is the implementation of the above approach:

C++

// 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;
}

Java

// 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

Python3

# Python3 program to print nodes of 
# extreme corners of each level in 
# alternate order
from collections import deque
  
# A binary tree node has key, pointer to left
# child and a pointer to right child
class Node:
    def __init__(self, key):
          
        self.data = key
        self.left = None
        self.right = None
  
# Function that returns the height of
# the binary tree
def height(root: Node) -> int:
  
    if (root is None):
        return 0
  
    lheight = height(root.left)
    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
def rightToLeft(root: Node, level: int) -> int:
      
    global f
  
    if (root is None):
        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 and f == 0):
        print("%d " % root.data, end = "")
        f = 1
  
    elif (level > 1):
        rightToLeft(root.right, level - 1)
        rightToLeft(root.left, level - 1)
  
# Function performs level order traversal 
# from left to right and prints the first 
# node during the traversal
def leftToRight(root: Node, level: int):
      
    global f
  
    if (root is None):
        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 and f == 1):
        print("%d " % root.data, end = "")
        f = 0
  
    elif (level > 1):
        leftToRight(root.left, level - 1)
        leftToRight(root.right, level - 1)
  
# Function to print the extreme nodes of
# a given binary tree
def printExtremeNodes(root: Node):
      
    global f
  
    # Stores height of binary tree
    h = height(root)
  
    # Flag to mark the change in level
    flag = 0
  
    # To check if the extreme node of a
    # particular level has been visited
    f = 0
  
    for i in range(1, h + 1):
          
        # 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)
            flag = 1
  
        # If flag is one then traverse from
        # left to right at the given level and
        # print the first node during the traversal
        elif (flag == 1):
     &nbs