📌  相关文章
📜  递归程序以交替顺序打印每级二叉树的极端节点

📅  最后修改于: 2022-05-13 01:57:19.933000             🧑  作者: Mango

递归程序以交替顺序打印每级二叉树的极端节点

给定一棵二叉树,任务是打印每个级别的极端角的节点,但顺序是交替的。
例子:

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

我们已经讨论了解决这个问题的迭代方法。在这篇文章中,我们讨论了递归方法。
方法:这个想法是以螺旋形式执行级别顺序遍历,并在每个级别打印遍历期间的第一个节点,这些节点将是交替形式中存在的极端角落的节点。
下面是上述方法的实现:

C++
// C++ program to print nodes of extreme corners
// of each level in alternate order
 
#include 
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):
            leftToRight(root, i)
            flag = 0
 
    return
 
# Driver Code
if __name__ == "__main__":
     
    root = Node(1)
 
    root.left = Node(2)
    root.right = Node(3)
 
    root.left.left = Node(4)
    root.left.right = Node(5)
    root.right.right = Node(7)
 
    root.left.left.left = Node(8)
    root.left.left.right = Node(9)
    root.left.right.left = Node(10)
    root.left.right.right = Node(11)
    root.right.right.left = Node(14)
    root.right.right.right = Node(15)
 
    root.left.left.left.left = Node(16)
    root.left.left.left.right = Node(17)
    root.right.right.right.right = Node(31)
 
    printExtremeNodes(root)
 
# This code is contributed by sanjeev2552


C#
// 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 */


Javascript


输出:
1 2 7 8 31    

时间复杂度:O(N^2),其中 N 是二叉树中节点的总数。
辅助空间: O(N)