hdoj3791
题目:
接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。
接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。
567432
543267
576342
0
NO
分析:
#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的更多相关文章
随机推荐
- 第3章 衡量线性回归的指标:MSE,RMSE,MAE
, , ,, , , ,
- 【HTTP】Web服务器和HTTP的协作&HTTP首部
用单台虚拟主机实现多个域名 Web服务器可以搭建多个独立域名的Web网站,也可以作为通信路径上的中转服务器提升效率. HTTP/1.1规范允许一台HTTP服务器搭建多个Web站点,提供Web托管服务的 ...
- nodejs模块介绍与使用
1.内置模块 http fs path url os等等 (无需安装直接require引入即可) 2.第三方模块: express mysql ejs等等 (npm包管理工具下载require引入) ...
- 附件2:async/await
在实际开发中总会遇到许多异步的问题,最常见的场景便是接口请求之后一定要等一段时间才能得到结果,如果遇到多个接口前后依赖,那么问题就变得复杂.大家都一直在尝试使用更好的方案来解决这些问题.最开始只能利用 ...
- Android系统签名简介
apk的签名,简单说开发者可以通过签名 对应用进行标识和更新.包名在一个设备上是唯一的,这样可以避免被相同包名应用随意覆盖安装.这是一个非常重要的安全功能.系统中的签名文件,也是对系统中应用进行签名, ...
- 线程池续:你必须要知道的线程池submit()实现原理之FutureTask!
前言 上一篇内容写了Java中线程池的实现原理及源码分析,说好的是实实在在的大满足,想通过一篇文章让大家对线程池有个透彻的了解,但是文章写完总觉得还缺点什么? 上篇文章只提到线程提交的execute( ...
- Unity 游戏框架搭建 2019 (五十六/五十七) 需求分析-架构中最重要的一环&从 EmptyGO 到 Manager Of Managers
我们的项目开始立项的时候,最常见的一个情况就是:几个人的小团队,一开始什么也不做,就开始写代码,验证逻辑,游戏就开始写起来了.而公司的一些所谓的领导层面一开始就把游戏定义为我们要做一个大作.这个事情本 ...
- HTML、CSS与JS实现简易iPhone计算器
效果如图 源码,通俗易懂 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...
- 【大厂面试03期】MySQL是怎么解决幻读问题的?
问题分析 首先幻读是什么? 根据MySQL文档上面的定义 The so-called phantom problem occurs within a transaction when the same ...
- Java实现 LeetCode 689 三个无重叠子数组的最大和(换方向筛选)
689. 三个无重叠子数组的最大和 给定数组 nums 由正整数组成,找到三个互不重叠的子数组的最大和. 每个子数组的长度为k,我们要使这3*k个项的和最大化. 返回每个区间起始索引的列表(索引从 0 ...