题目

Problem Description
判断两序列是否为同一二叉搜索树序列
 
Input
开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束。
接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。
接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。
 
Output
如果序列相同则输出YES,否则输出NO
 
Sample Input
2
567432
543267
576342
0
 
Sample Output
YES
NO
 

分析:

一道二叉搜索树的题目。将序列转换成二叉搜索树,然后遍历。如果遍历的结果相同,那么是同一颗二叉树。注意没有重复数字。
下方给出了前序遍历的解法。
 
https://github.com/pusidun/OJ_Answer/tree/master/HDOJ/3791
#include <cstdio>
#include <vector>
#include <cstring>
#include <iostream>
using namespace std; //rst1保存第一个树的前序遍历结果,rst2保存后面n个树的前序遍历结果,index为这2个数组的下标
int rst1[];
int rst2[];
int index = ; class BST{
private:
struct Node{
int key;
Node* left;
Node* right; Node(){
this->key = ;
this->left = NULL;
this->right = NULL;
} Node(int num){
this->key = num;
this->left = NULL;
this->right = NULL;
} }; Node* root; Node* insert(Node* node, int num){
if (node == NULL){
count++;
return new Node(num);
}
if (node->key < num){
node->right = insert(node->right, num);
}
else if (node->key > num){
node->left = insert(node->left, num);
}
return node;
} //select用来选择前序遍历结果的保存位置
void preOrder(Node* node, int select){
if (node == NULL)
return;
if (select == )
rst1[index++] = node->key;
else if (select == )
rst2[index++] = node->key;
preOrder(node->left, select);
preOrder(node->right, select);
} void remove(Node* node){
if (node == NULL)
return;
remove(node->left);
remove(node->right);
delete node;
} public:
int count; BST(){
root = NULL;
count = ;
} ~BST(){
remove(root);
} void insert(int num){
root = insert(root, num);
} void preOrder(int select){
preOrder(root, select);
}
}; void str2int(char* s, int* arr){
for (int i = ; s[i] != '\0'; i++){
arr[i] = s[i] - '';
}
} int main()
{
int n; //第一个数n
while (scanf("%d", &n) != EOF && n != )
{
BST raw; //第一行序列
int num = ; //存储序列的数组
char tmp[];
int raw_seq[];
int test_seq[]; memset(tmp, , sizeof(tmp));
memset(raw_seq, -, sizeof(raw_seq));
scanf("%s", tmp);
str2int(tmp, raw_seq); for (int i = ; raw_seq[i] != - && i<; i++)
raw.insert(raw_seq[i]); for (int i = ; i<n; i++){
BST test; //接下来的n行序列
memset(tmp, , sizeof(tmp));
memset(test_seq, -, sizeof(test_seq));
scanf("%s", tmp);
str2int(tmp, test_seq);
for (int i = ; test_seq[i] != - && i<; i++)
test.insert(test_seq[i]); index = ;
raw.preOrder();
index = ;
test.preOrder(); int flag = ;
for (int i = ; i < index; i++)
if (rst1[i] != rst2[i]){
flag = ;
break;
} if (flag == )
printf("NO\n");
else if (flag == )
printf("YES\n");
}
}
return ;
}

hdoj3791的更多相关文章

随机推荐

  1. java中String转换成json,json转换成String

    前置添加pom <!-- 配置gson --> <dependency> <groupId>com.google.code.gson</groupId> ...

  2. Python中对文件的读写

    读写文件前,我们先必须了解一下,在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘. 读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),然后,通过操作系 ...

  3. ngnix随笔一

    nginx安装及启动 1.用yum源安装,首先配置yum源 在“/etc/yum.repo.d/”下创建yum源文件 例如:cd /etc/yum.repo.d/nginx.repo [nginx-s ...

  4. CSS 风车(花瓣)旋转动画圆角

    这是一个综合的案例,用到了transition(动画,动作在单位时间内完成),transform(旋转),border-radius(圆角),absolute(定位),linear-gradient( ...

  5. 深入浅出Spring MVC

    摘要 本文旨在详细分析SpringMVC工作原理以及作为开发者如何基于SpringMVC做扩展.因为SpringMVC分析的文章比较多,所以本文重点讲解如何利用SpringMVC的扩展点实现我们的需求 ...

  6. LM NTML NET-NTLM2理解及hash破解

    LM Windows Vista / Server 2008已经默认关闭,在老版本可以遇到,但根据windwos的向下兼容性,可以通过组策略启用它(https://support.microsoft. ...

  7. JavaScript的历史由来及简介

    JavaScript的历史由来及简介 前言 这次写一篇对于JavaScript的简介,我们知道的编程语言有很多种,比如Java.C++.Python等等,每种编程语言都有其独具的特色,不论是语法格式还 ...

  8. 【算法基础】Trie算法

    字符串统计 维护一个字符串集合,支持两种操作: “I x”向集合中插入一个字符串x: “Q x”询问一个字符串在集合中出现了多少次. 共有N个操作,输入的字符串总长度不超过 105105,字符串仅包含 ...

  9. Java实现 LeetCode 804 唯一摩尔斯密码词 (暴力)

    804. 唯一摩尔斯密码词 国际摩尔斯密码定义一种标准编码方式,将每个字母对应于一个由一系列点和短线组成的字符串, 比如: "a" 对应 ".-", " ...

  10. 一张图说清楚Flink水印和Lateness

    真传一句话,假言万卷书. Flink使用窗口与水印处理乱序问题,使用Latenss处理延迟问题,二者混合使用可以满足很多复杂场景的需求 当Watermark大于窗口结束时间时,会触发窗口内的元素进行计 ...