5-4 是否同一棵二叉搜索树 (25分)
2015-10-03 15:55
337 查看
5-4 是否同一棵二叉搜索树 (25分)
给定一个插入序列就可以唯一确定一棵二叉搜索树。然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到。例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果。于是对于输入的各种插入序列,你需要判断它们是否能生成一样的二叉搜索树。
简单起见,我们保证每个插入序列都是1到N的一个排列。当读到N为0时,标志输入结束,这组数据不要处理。
时间限制:400ms
内存限制:64MB
代码长度限制:16kB
判题程序:系统默认
作者:陈越
单位:浙江大学
题目判定
给定一个插入序列就可以唯一确定一棵二叉搜索树。然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到。例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果。于是对于输入的各种插入序列,你需要判断它们是否能生成一样的二叉搜索树。
输入格式:
输入包含若干组测试数据。每组数据的第1行给出两个正整数N (≤10)和L,分别是每个序列插入元素的个数和需要检查的序列个数。第2行给出N个以空格分隔的正整数,作为初始插入序列。最后L行,每行给出N个插入的元素,属于L个需要检查的序列。简单起见,我们保证每个插入序列都是1到N的一个排列。当读到N为0时,标志输入结束,这组数据不要处理。
输出格式:
对每一组需要检查的序列,如果其生成的二叉搜索树跟对应的初始序列生成的一样,输出“Yes”,否则输出“No”。输入样例:
4 2 3 1 4 2 3 4 1 2 3 2 4 1 2 1 2 1 1 2 0
输出样例:
Yes No No
时间限制:400ms
内存限制:64MB
代码长度限制:16kB
判题程序:系统默认
作者:陈越
单位:浙江大学
题目判定
/* 5-4 是否同一棵二叉搜索树 (25分) http://pta.patest.cn/pta/test/15/exam/4/question/712 */ #include <cstdio> #include <cstdlib> #include <iostream> #include <vector> #include <queue> #include <map> #include <algorithm> #include <set> #include <string> using namespace std; #define N 1005 int n , m ; typedef struct node{ int data ; struct node* left ; struct node* right ; node(int _data = -1) { data = _data ; left = NULL ; right = NULL ; } }Bnode; // 二叉排序树 插入 建树 Bnode* createTree(Bnode* root,int data) { if(root == NULL) root = new node(data); else{ if(data < root->data ) root->left = createTree( root->left,data); if(data > root->data) { root->right = createTree( root->right,data); } } return root ; } // 递归判断两棵树 是否是一摸一样的 bool isSame(Bnode* root , Bnode* root2) { if(root == NULL && root2 == NULL) { return true; } else if(root == NULL && root2 != NULL) { return false; } else if(root != NULL && root2 == NULL) { return false; } else if(root->data != root2->data) return false; else{ bool flag1 = isSame(root->left , root2->left); if(flag1){ bool flag2 = isSame(root->right , root2->right) ; if(flag2) return true; } return false; } } int main() { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); while(scanf("%d",&n) != EOF && n != 0) { scanf("%d",&m); int i , tmpn ; Bnode* root = NULL ; for(i = 0 ; i < n ; i++) { scanf("%d",&tmpn); root = createTree(root,tmpn); } while(m --) { Bnode* root2 = NULL ; for(i = 0 ; i < n ; i++) { scanf("%d",&tmpn); root2 = createTree(root2,tmpn); } if(isSame(root , root2)) printf("Yes\n"); else printf("No\n"); } } return 0 ; }
相关文章推荐
- 友盟统计不生效问题查找与解决
- Python学习笔记<list,tuple,range再探>
- 142. Linked List Cycle II (List; Two-Pointers)
- pat1017Queueing at Bank (25)
- Wow! Such Doge!---hdu4847(字符串水题)
- 【kmp】算法总结
- 141. Linked List Cycle (List; Two-Pointers)
- Count Complete Tree Nodes
- [摘要]Effective Objective-C 2.0(四)
- 对于JVM的浅解
- ZOJ-3897-Fiddlesticks
- 重识面向对象
- uva10810(求逆序数)
- nginx的accept互斥锁
- 打开新的页面.HTML
- NSNotificationCenter defaultCenter笔记
- 2算法-二分查找
- 大话设计模式笔记 组合模式 迭代模式 单例模式
- 海岛奇兵游戏设计分析
- POJ 1276 Cash Machine (多重背包)