📜  打印二叉树的所有回文层次

📅  最后修改于: 2021-04-22 06:56:14             🧑  作者: Mango

给定二叉树,任务是打印该树的所有回文级别。

Palindrom级别如果从左到右遍历二叉树的任何级别,则称其为回文级别,其结果与从右到左遍历该级别的结果相同。

例子:

Input: 
                 1
                /  \ 
              12    13 
             /     /   \ 
            11    6     11 
                   \    / 
                   2   2  
Output:
1
11 6 11
2 2
Explanation:
First, third and fourth levels are plaindrome.

Input: 
                 7
                /  \ 
              22      22 
             /  \      \
            3     6     3 
           / \     \    / 
          1   5     8   1    
                   /
                  23 
Output:
7
22 22
3 6 3
23

Explanation:
First, second, third and fifth levels are plaindrome.

方法:为了检查每个级别是否都是回文级别,我们需要首先执行二叉树的级别顺序遍历以获取每个级别的值。然后对于每个级别,检查它是否是回文。
这里,队列数据结构用于在执行级别顺序遍历时存储树的级别。

下面是上述方法的实现:

C++
// C++ program for printing a
// Palindromic Levels of Binary Tree
 
#include 
using namespace std;
 
// A Tree node
struct Node {
    int key;
    struct Node *left, *right;
};
 
// Utility function to create a new node
Node* newNode(int key)
{
    Node* temp = new Node;
    temp->key = key;
    temp->left = temp->right = NULL;
    return (temp);
}
 
// Function to print a Palindromic level
void printLevel(struct Node* queue[],
                int index, int size)
{
    for (int i = index; i < size; i++) {
        cout << queue[i]->key << " ";
    }
 
    cout << endl;
}
 
// Function to check whether given level
// is Palindromic level or not
bool isPalindrome(struct Node* queue[],
                  int index, int size)
{
 
    while (index < size) {
        // check value of two nodes are
        // equal or not
        if (queue[index++]->key
            != queue[size--]->key)
            return false;
    }
 
    return true;
}
 
// Utility function to get palindromic
// level of a given Binary tree
void printPalLevel(struct Node* node,
                   struct Node* queue[],
                   int index, int size)
{
 
    // Print root node value
    // as a single value in a
    // level is also a Palindrome
    cout << queue[index]->key << endl;
 
    // Level order traversal of Tree
    while (index < size) {
        int curr_size = size;
        while (index < curr_size) {
            struct Node* temp = queue[index];
 
            if (temp->left != NULL) {
                queue[size++] = temp->left;
            }
 
            if (temp->right != NULL) {
                queue[size++] = temp->right;
            }
 
            index++;
        }
 
        // Check if level is Palindrome or not
        if (isPalindrome(queue, index, size - 1)) {
            printLevel(queue, index, size);
        }
    }
}
 
// Function to find total no of nodes
int findSize(struct Node* node)
{
 
    if (node == NULL)
        return 0;
 
    return 1
           + findSize(node->left)
           + findSize(node->right);
}
 
// Function to find palindromic level
// In a given binary tree
void printPalindromicLevel(struct Node* node)
{
    int t_size = findSize(node);
    struct Node* queue[t_size];
    queue[0] = node;
    printPalLevel(node, queue, 0, 1);
}
 
// Driver Code
int main()
{
    /*     10
        /    \
       13     13
        /       \
        14        15
        / \        / \
       21 22      22 21
                     /
                    8 */
 
    // Create Binary Tree as shown
    Node* root = newNode(10);
    root->left = newNode(13);
    root->right = newNode(13);
 
    root->right->left = newNode(14);
    root->right->right = newNode(15);
 
    root->right->left->left = newNode(21);
    root->right->left->right = newNode(22);
    root->right->right->left = newNode(22);
    root->right->right->right = newNode(21);
    root->right->right->right->left = newNode(8);
 
    // Print Palindromic Levels
    printPalindromicLevel(root);
 
    return 0;
}


Java
// Java program for printing a
// Palindromic Levels of Binary Tree
class GFG{
  
// A Tree node
static class Node {
    int key;
    Node left, right;
};
  
// Utility function to create a new node
static Node newNode(int key)
{
    Node temp = new Node();
    temp.key = key;
    temp.left = temp.right = null;
    return (temp);
}
  
// Function to print a Palindromic level
static void printLevel(Node queue[],
                int index, int size)
{
    for (int i = index; i < size; i++) {
        System.out.print(queue[i].key+ " ");
    }
  
    System.out.println();
}
  
// Function to check whether given level
// is Palindromic level or not
static boolean isPalindrome(Node queue[],
                  int index, int size)
{
  
    while (index < size) {
        // check value of two nodes are
        // equal or not
        if (queue[index++].key
            != queue[size--].key)
            return false;
    }
  
    return true;
}
  
// Utility function to get palindromic
// level of a given Binary tree
static void printPalLevel(Node node,
                   Node queue[],
                   int index, int size)
{
  
    // Print root node value
    // as a single value in a
    // level is also a Palindrome
    System.out.print(queue[index].key +"\n");
  
    // Level order traversal of Tree
    while (index < size) {
        int curr_size = size;
        while (index < curr_size) {
            Node temp = queue[index];
  
            if (temp.left != null) {
                queue[size++] = temp.left;
            }
  
            if (temp.right != null) {
                queue[size++] = temp.right;
            }
  
            index++;
        }
  
        // Check if level is Palindrome or not
        if (isPalindrome(queue, index, size - 1)) {
            printLevel(queue, index, size);
        }
    }
}
  
// Function to find total no of nodes
static int findSize(Node node)
{
  
    if (node == null)
        return 0;
  
    return 1
           + findSize(node.left)
           + findSize(node.right);
}
  
// Function to find palindromic level
// In a given binary tree
static void printPalindromicLevel(Node node)
{
    int t_size = findSize(node);
    Node []queue = new Node[t_size];
    queue[0] = node;
    printPalLevel(node, queue, 0, 1);
}
  
// Driver Code
public static void main(String[] args)
{
    /*     10
        /    \
       13     13
        /       \
        14        15
        / \        / \
       21 22      22 21
                     /
                    8 */
  
    // Create Binary Tree as shown
    Node root = newNode(10);
    root.left = newNode(13);
    root.right = newNode(13);
  
    root.right.left = newNode(14);
    root.right.right = newNode(15);
  
    root.right.left.left = newNode(21);
    root.right.left.right = newNode(22);
    root.right.right.left = newNode(22);
    root.right.right.right = newNode(21);
    root.right.right.right.left = newNode(8);
  
    // Print Palindromic Levels
    printPalindromicLevel(root);
  
}
}
 
// This code is contributed by Rajput-Ji


Python3
# Python3 program for printing a
# Palindromic Levels of Binary Tree
 
# A BST node
class Node:
     
    def __init__(self, x):
         
        self.key = x
        self.left = None
        self.right = None
 
# Function to pra Palindromic level
def printLevel(queue, index, size):
     
    for i in range(index, size):
        print(queue[i].key, end = " ")
         
    print()
 
# Function to check whether given level
# is Palindromic level or not
def isPalindrome(queue, index, size):
     
    #print(index,size)
 
    while (index < size):
         
        # Check value of two nodes are
        # equal or not
        if (queue[index].key != queue[size].key):
            return False
             
        index += 1
        size -= 1
 
    return True
 
# Utility function to get palindromic
# level of a given Binary tree
def printPalLevel(node, queue, index, size):
     
    # Print root node value
    # as a single value in a
    # level is also a Palindrome
    print(queue[index].key)
 
    # Level order traversal of Tree
    while (index < size):
        curr_size = size
         
        while (index < curr_size):
            temp = queue[index]
             
            if (temp.left != None):
                queue[size] = temp.left
                size += 1
 
            if (temp.right != None):
                queue[size] = temp.right
                size += 1
 
            index += 1
 
        # Check if level is Palindrome or not
        if (isPalindrome(queue, index, size - 1) == True):
            printLevel(queue, index, size)
 
# Function to find total no of nodes
def findSize(node):
 
    if (node == None):
        return 0
 
    return (1 + findSize(node.left) +
                findSize(node.right))
 
# Function to find palindromic level
# In a given binary tree
def printPalindromicLevel(node):
     
    t_size = findSize(node)
    queue = [None for i in range(t_size)]
    queue[0] = node
    printPalLevel(node, queue, 0, 1)
 
# Driver Code
if __name__ == '__main__':
     
    #       10
    #     /    \
    #    13     13
    #     /       \
    #     14        15
    #     / \        / \
    #    21 22      22 21
    #                  /
    #                 8
 
    # Create Binary Tree as shown
    root = Node(10)
    root.left = Node(13)
    root.right = Node(13)
 
    root.right.left = Node(14)
    root.right.right = Node(15)
 
    root.right.left.left = Node(21)
    root.right.left.right = Node(22)
    root.right.right.left = Node(22)
    root.right.right.right = Node(21)
    root.right.right.right.left = Node(8)
 
    # Print Palindromic Levels
    printPalindromicLevel(root)
 
# This code is contributed by mohit kumar 29


C#
// C# program for printing a
// Palindromic Levels of Binary Tree
using System;
 
class GFG{
   
// A Tree node
class Node {
    public int key;
    public Node left, right;
};
   
// Utility function to create a new node
static Node newNode(int key)
{
    Node temp = new Node();
    temp.key = key;
    temp.left = temp.right = null;
    return (temp);
}
   
// Function to print a Palindromic level
static void printLevel(Node []queue,
                int index, int size)
{
    for (int i = index; i < size; i++) {
        Console.Write(queue[i].key+ " ");
    }
   
    Console.WriteLine();
}
   
// Function to check whether given level
// is Palindromic level or not
static bool isPalindrome(Node []queue,
                  int index, int size)
{
   
    while (index < size) {
        // check value of two nodes are
        // equal or not
        if (queue[index++].key
            != queue[size--].key)
            return false;
    }
   
    return true;
}
   
// Utility function to get palindromic
// level of a given Binary tree
static void printPalLevel(Node node,
                   Node []queue,
                   int index, int size)
{
   
    // Print root node value
    // as a single value in a
    // level is also a Palindrome
    Console.Write(queue[index].key +"\n");
   
    // Level order traversal of Tree
    while (index < size) {
        int curr_size = size;
        while (index < curr_size) {
            Node temp = queue[index];
   
            if (temp.left != null) {
                queue[size++] = temp.left;
            }
   
            if (temp.right != null) {
                queue[size++] = temp.right;
            }
   
            index++;
        }
   
        // Check if level is Palindrome or not
        if (isPalindrome(queue, index, size - 1)) {
            printLevel(queue, index, size);
        }
    }
}
   
// Function to find total no of nodes
static int findSize(Node node)
{
   
    if (node == null)
        return 0;
   
    return 1
           + findSize(node.left)
           + findSize(node.right);
}
   
// Function to find palindromic level
// In a given binary tree
static void printPalindromicLevel(Node node)
{
    int t_size = findSize(node);
    Node []queue = new Node[t_size];
    queue[0] = node;
    printPalLevel(node, queue, 0, 1);
}
   
// Driver Code
public static void Main(String[] args)
{
    /*     10
        /    \
       13     13
        /       \
        14        15
        / \        / \
       21 22      22 21
                     /
                    8 */
   
    // Create Binary Tree as shown
    Node root = newNode(10);
    root.left = newNode(13);
    root.right = newNode(13);
   
    root.right.left = newNode(14);
    root.right.right = newNode(15);
   
    root.right.left.left = newNode(21);
    root.right.left.right = newNode(22);
    root.right.right.left = newNode(22);
    root.right.right.right = newNode(21);
    root.right.right.right.left = newNode(8);
   
    // Print Palindromic Levels
    printPalindromicLevel(root);
   
}
}
  
// This code is contributed by sapnasingh4991


输出:
10
13 13 
21 22 22 21 
8