📜  检查二叉树的有序遍历是否是回文

📅  最后修改于: 2021-04-26 07:23:24             🧑  作者: Mango

给定一个二叉树,并执行任务以检查其有序序列是否为回文序列。

例子:

方法:
要解决此问题,请参考以下步骤:

  • 将给定的二叉树转换为双链表。
  • 这减少了检查字符的双向链接列表是否为回文式的问题。

下面是上述方法的实现:

C++
// C++ Program to check if
// the Inorder sequence of a
// Binary Tree is a palindrome
  
#include 
using namespace std;
  
// Define node of tree
struct node {
    char val;
    node* left;
    node* right;
};
  
// Function to create the node
node* newnode(char i)
{
    node* temp = NULL;
    temp = new node();
    temp->val = i;
    temp->left = NULL;
    temp->right = NULL;
    return temp;
}
  
// Function to convert the tree
// to the double linked list
node* conv_tree(node* root,
                node* shoot)
{
    if (root->left != NULL)
        shoot = conv_tree(root->left,
                          shoot);
  
    root->left = shoot;
  
    if (shoot != NULL)
        shoot->right = root;
  
    shoot = root;
  
    if (root->right != NULL)
        shoot = conv_tree(root->right,
                          shoot);
  
    return shoot;
}
  
// Function for checking linked
// list is palindrom or not
int checkPalin(node* root)
{
    node* voot = root;
  
    // Count the nodes
    // form the back
    int j = 0;
  
    // Set the pointer at the
    // very first node of the
    // linklist and count the
    // length of the linklist
    while (voot->left != NULL) {
        j = j + 1;
        voot = voot->left;
    }
    int i = 0;
  
    while (i < j) {
        // Check if the value matches
        if (voot->val != root->val)
            return 0;
  
        else {
            i = i + 1;
            j = j - 1;
            voot = voot->right;
            root = root->left;
        }
    }
  
    return 1;
}
  
// Driver Program
int main()
{
    node* root = newnode('b');
    root->left = newnode('b');
    root->right = newnode('a');
    root->left->right = newnode('b');
    root->left->left = newnode('a');
  
    node* shoot = conv_tree(root, NULL);
  
    if (checkPalin(shoot))
        cout << "True" << endl;
    else
        cout << "False" << endl;
}


Java
// Java Program to check if
// the Inorder sequence of a
// Binary Tree is a palindrome
import java.util.*;
class GFG{
  
// Define node of tree
static class node
{
    char val;
    node left;
    node right;
};
  
// Function to create the node
static node newnode(char i)
{
    node temp = null;
    temp = new node();
    temp.val = i;
    temp.left = null;
    temp.right = null;
    return temp;
}
  
// Function to convert the tree
// to the double linked list
static node conv_tree(node root,
                      node shoot)
{
    if (root.left != null)
        shoot = conv_tree(root.left,
                          shoot);
  
    root.left = shoot;
  
    if (shoot != null)
        shoot.right = root;
  
    shoot = root;
  
    if (root.right != null)
        shoot = conv_tree(root.right,
                          shoot);
  
    return shoot;
}
  
// Function for checking linked
// list is palindrom or not
static int checkPalin(node root)
{
    node voot = root;
  
    // Count the nodes
    // form the back
    int j = 0;
  
    // Set the pointer at the
    // very first node of the
    // linklist and count the
    // length of the linklist
    while (voot.left != null)
    {
        j = j + 1;
        voot = voot.left;
    }
    int i = 0;
  
    while (i < j) 
    {
        // Check if the value matches
        if (voot.val != root.val)
            return 0;
  
        else 
        {
            i = i + 1;
            j = j - 1;
            voot = voot.right;
            root = root.left;
        }
    }
    return 1;
}
  
// Driver Code
public static void main(String[] args)
{
    node root = newnode('b');
    root.left = newnode('b');
    root.right = newnode('a');
    root.left.right = newnode('b');
    root.left.left = newnode('a');
  
    node shoot = conv_tree(root, null);
  
    if (checkPalin(shoot) == 1)
        System.out.print("True" + "\n");
    else
        System.out.print("False" + "\n");
}
}
  
// This code is contributed by 29AjayKumar


Python3
# Python3 program to check if
# the Inorder sequence of a
# Binary Tree is a palindrome
  
# Define node of tree
class Node: 
    def __init__(self,val): 
          
        self.val = val 
        self.left = None
        self.right = None
  
# Function to create the node
def newnode(i):
  
    #temp = None;
    temp = Node(i);
    temp.val = i;
    temp.left = None;
    temp.right = None;
    return temp;
  
# Function to convert the tree
# to the double linked list
def conv_tree(root, shoot):
  
    if (root.left != None):
        shoot = conv_tree(root.left, shoot);
  
    root.left = shoot;
  
    if (shoot != None):
        shoot.right = root;
  
    shoot = root;
  
    if (root.right != None):
        shoot = conv_tree(root.right, shoot);
  
    return shoot;
  
# Function for checking linked
# list is palindrom or not
def checkPalin(root):
  
    voot = root;
  
    # Count the nodes
    # form the back
    j = 0;
  
    # Set the pointer at the
    # very first node of the
    # linklist and count the
    # length of the linklist
    while (voot.left != None): 
        j = j + 1;
        voot = voot.left;
      
    i = 0;
  
    while (i < j):
          
        # Check if the value matches
        if (voot.val != root.val):
            return 0;
        else:
            i = i + 1;
            j = j - 1;
            voot = voot.right;
            root = root.left;
              
    return 1;
  
# Driver code
if __name__=='__main__': 
  
    root = newnode('b');
    root.left = newnode('b');
    root.right = newnode('a');
    root.left.right = newnode('b');
    root.left.left = newnode('a');
  
    shoot = conv_tree(root, None);
  
    if (checkPalin(shoot)):
        print("True");
    else:
        print("False");
  
# This code is contributed by AbhiThakur


C#
// C# program to check if the inorder  
// sequence of a Binary Tree is a 
// palindrome
using System;
  
class GFG{
  
// Define node of tree
class node
{
    public char val;
    public node left;
    public node right;
};
  
// Function to create the node
static node newnode(char i)
{
    node temp = null;
    temp = new node();
    temp.val = i;
    temp.left = null;
    temp.right = null;
  
    return temp;
}
  
// Function to convert the tree
// to the double linked list
static node conv_tree(node root,
                      node shoot)
{
    if (root.left != null)
        shoot = conv_tree(root.left,
                          shoot);
  
    root.left = shoot;
  
    if (shoot != null)
        shoot.right = root;
  
    shoot = root;
  
    if (root.right != null)
        shoot = conv_tree(root.right,
                          shoot);
  
    return shoot;
}
  
// Function for checking linked
// list is palindrom or not
static int checkPalin(node root)
{
    node voot = root;
  
    // Count the nodes
    // form the back
    int j = 0;
  
    // Set the pointer at the
    // very first node of the
    // linklist and count the
    // length of the linklist
    while (voot.left != null)
    {
        j = j + 1;
        voot = voot.left;
    }
    int i = 0;
  
    while (i < j) 
    {
          
        // Check if the value matches
        if (voot.val != root.val)
            return 0;
        else
        {
            i = i + 1;
            j = j - 1;
            voot = voot.right;
            root = root.left;
        }
    }
    return 1;
}
  
// Driver Code
public static void Main(String[] args)
{
    node root = newnode('b');
    root.left = newnode('b');
    root.right = newnode('a');
    root.left.right = newnode('b');
    root.left.left = newnode('a');
  
    node shoot = conv_tree(root, null);
  
    if (checkPalin(shoot) == 1)
        Console.Write("True" + "\n");
    else
        Console.Write("False" + "\n");
}
}
  
// This code is contributed by 29AjayKumar


输出:
True

时间复杂度: O(N)
辅助空间: O(1)