题目

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. Rocket - debug - TLDebugModuleInner

    https://mp.weixin.qq.com/s/jkiHceU0HaJbHGvHiU-QOA 简单介绍TLDebugModuleInner的实现. 1. 引入全局配置 1) cfg 引入Debu ...

  2. Java实现 LeetCode 745 前缀和后缀搜索(使用Hash代替字典树)

    745. 前缀和后缀搜索 给定多个 words,words[i] 的权重为 i . 设计一个类 WordFilter 实现函数WordFilter.f(String prefix, String su ...

  3. Java实现 蓝桥杯 算法训练 区间k大数

    算法训练 区间k大数查询 时间限制:1.0s 内存限制:256.0MB 问题描述 给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个. 输入格式 第一行包含一个数n,表示序列长度. 第二 ...

  4. Java实现 蓝桥杯 算法提高 最大值路径

    试题 算法提高 最大值路径 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 刷微博,编程序.如下图所示,@北京发布 提出了如下"头脑震荡"问题.对此问题做一般化描 ...

  5. Java GUI 窗体事件

    import java.awt.Frame; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; publi ...

  6. java实现第七届蓝桥杯七星填数

    七星填数 如图[图1.png]所示. 在七角星的14个节点上填入1~14 的数字,不重复,不遗漏. 要求每条直线上的四个数字之和必须相等. 图中已经给出了3个数字. 请计算其它位置要填充的数字,答案唯 ...

  7. java实现第五届蓝桥杯切面条

    切面条 一根高筋拉面,中间切一刀,可以得到2根面条. 如果先对折1次,中间切一刀,可以得到3根面条. 如果连续对折2次,中间切一刀,可以得到5根面条. 那么,连续对折10次,中间切一刀,会得到多少面条 ...

  8. WSO2 - MI

    简介 WSO2MI(Micro Integrator)是一个事件驱动的企业服务总线(Enterprise Service Bus),支持消息路由.数据格式转换.通信协议转换,支持连接SAP.KAFKA ...

  9. 简谈Java语言的封装

    简谈Java语言的封装 封装的定义 封装将复杂模块或系统的逻辑实现细节隐藏,让使用者只需要关心这个模块或系统怎么使用,而不用关心这个模块或系统是怎么实现的. 在面向对象的的编程中,我们一般通过接口来描 ...

  10. iOS-MapKit的使用笔记

    对于地图和定位,苹果公司提供给了两个框架: MapKit:用于地图展示 Core Location :用于地理定位 这次总结MapKit:       同样,在使用MapKit时首先要导入头文件: 与 ...