给定一个二叉树,并执行任务以检查其有序序列是否为回文序列。
例子:
Input:
Output: True
Explanation:
The Inorder sequence of the tree is “bbaaabb” which is a palindromic string.
Input:
Output: False
Explanation:
The Inorder sequence of the tree is “bbdaabb” which is not a palindromic string.
方法:
要解决此问题,请参考以下步骤:
- 将给定的二叉树转换为双链表。
- 这减少了检查字符的双向链接列表是否为回文式的问题。
下面是上述方法的实现:
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)