题目

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. iptables基本用法

    iptables选项参数 [root@test ~]# iptables --help -L #列出指定表所有链上的所有规则,本选项须置于-n选项后面 -n #以数字格式显示地址和端口号 -v #详细 ...

  2. SpringBoot工程创建的三种方式

    一. 通过IDEA的spring Initializer创建 1. 打开创建项目面板 File->New->Project->Spring Initializr 2. 填写Maven ...

  3. cordova开发插件,并在android studio中开发、调试

    之前用过cordova Lib包装H5页面,自己写插件,但做法是野路子,不符合cordova插件的开发思路,这次项目又需要包装H5页面,同时需要自定义插件.所以又折腾了一次cordova自定义插件. ...

  4. 小技巧:用 GitBook 组织 Markdown 文档

    喜欢用 Markdown 写文档,那怎么把一个个 Markdown 文档组成在一起呢? 这篇文章,分享了一个用 GitBook 来组织 Markdown 文档的办法.一起了解下吧. Markdown ...

  5. 当微信小程序遇到云开发,再加上一个类似 ColorUI 的模板,人人都能做小程序了

    作为一个 Java 程序员,早就想尝试一把微信小程序,但是一直苦于没有想法,再加上做一个漂亮的页面实在不太擅长. 由于自己比较喜欢历史,经常看历史方面的书.在一次梳理中国现有的朝代时,突然想到,要是可 ...

  6. Scala - 语言专家 - Desugar Scala code

    https://mp.weixin.qq.com/s/zwrG1MfUzXwtik7jotpQsA   介绍Intellij IDEA中的一个去除Scala语法糖的功能.     ​​   1. 去除 ...

  7. Chisel3 - Tutorial - Parity

    https://mp.weixin.qq.com/s/OtiQnE52PwdCpvmzJ6VFnA   奇偶发生器.统计输入中1的个数,如果为偶数则输出0,奇数则输出1.   参考链接: https: ...

  8. html css javascript实现弹弹球

    效果如图: 原创代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> & ...

  9. Java实现 LeetCode 834 树中距离之和(DFS+分析)

    834. 树中距离之和 给定一个无向.连通的树.树中有 N 个标记为 0-N-1 的节点以及 N-1 条边 . 第 i 条边连接节点 edges[i][0] 和 edges[i][1] . 返回一个表 ...

  10. Java实现 蓝桥杯 算法训练 纪念品分组

    问题描述 元旦快到了,校学生会让乐乐负责新年晚会的纪念品发放工作.为使得参加晚会的同学所获得的纪念品价值 相对均衡,他要把购来的纪念品根据价格进行分组,但每组最多只能包括两件纪念品,并且每组纪念品的价 ...