hdu 3791 二叉排序树

中序和一个别的序可以确定一颗bst,而先序和后序不能!

  1 #include <iostream>
  2 #include <cstring>
  3 #include <cstdio>
  4 using namespace std;
  5
  6 const int N = 11;
  7 char str[N];
  8 int cnt;
  9 int arr1[N];
 10 int arr2[N];
 11
 12 struct Node
 13 {
 14     Node * ch[2];
 15     int v;
 16     bool cmp( int x )
 17     {
 18         if ( x == v ) return -1;
 19         return x < v ? 0 : 1;
 20     }
 21 };
 22
 23 Node * root1, * root2;
 24
 25 void insert( Node * & o, int x )
 26 {
 27     if ( o == NULL )
 28     {
 29         o = new Node ();
 30         o->ch[0] = o->ch[1] = NULL;
 31         o->v = x;
 32         return ;
 33     }
 34     int d = o->cmp(x);
 35     if ( d == -1 ) return ;
 36     insert( o->ch[d], x );
 37 }
 38
 39 void free( Node * o )
 40 {
 41     if ( o != NULL )
 42     {
 43         free(o->ch[0]);
 44         free(o->ch[1]);
 45         delete o;
 46     }
 47 }
 48
 49 void preorder( Node * o, int * arr )
 50 {
 51     if ( o )
 52     {
 53         arr[cnt++] = o->v;
 54         preorder( o->ch[0], arr );
 55         preorder( o->ch[1], arr );
 56     }
 57 }
 58
 59 void inorder( Node * o, int * arr )
 60 {
 61     if ( o )
 62     {
 63         inorder( o->ch[0], arr );
 64         arr[cnt++] = o->v;
 65         inorder( o->ch[1], arr );
 66     }
 67 }
 68
 69 bool judge( Node * r1, Node * r2 )
 70 {
 71     cnt = 0;
 72     preorder( r1, arr1 );
 73     cnt = 0;
 74     preorder( r2, arr2 );
 75     for ( int i = 0; i < cnt; i++ )
 76     {
 77         if ( arr1[i] != arr2[i] ) return false;
 78     }
 79     cnt = 0;
 80     inorder( r1, arr1 );
 81     cnt = 0;
 82     inorder( r2, arr2 );
 83     for ( int i = 0; i < cnt; i++ )
 84     {
 85         if ( arr1[i] != arr2[i] ) return false;
 86     }
 87     return true;
 88 }
 89
 90 int main ()
 91 {
 92     int n;
 93     while ( scanf("%d", &n), n )
 94     {
 95         root1 = NULL;
 96         scanf("%s", str);
 97         for ( int i = 0; i < strlen(str); i++ )
 98         {
 99             insert( root1, str[i] );
100         }
101         for ( int i = 0; i < n; i++ )
102         {
103             root2 = NULL;
104             scanf("%s", str);
105             for ( int i = 0; i < strlen(str); i++ )
106             {
107                 insert( root2, str[i] );
108             }
109             if ( judge( root1, root2 ) )
110             {
111                 printf("YES\n");
112             }
113             else
114             {
115                 printf("NO\n");
116             }
117             free(root2);
118         }
119         free(root1);
120     }
121     return 0;
122 }
时间: 2024-12-15 00:50:41

hdu 3791 二叉排序树的相关文章

HDU 3791 二叉搜索树 题解

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

HDU 3791二叉搜索树解题(解题报告)

1.题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=3791 2.参考解题 http://blog.csdn.net/u013447865/article/details/22569639 这个题目本身简单,我的想法也很easy,但是发生在测试上,我把memset的参数搞错了,第三个是sizeof(a), 比如说int a[10],第三个参数应该是sizeof(10),也就是40,而我传的是10,导致后面的测试,都是答案错误,也就是后面的数据,初始

HDU 3791

http://acm.hdu.edu.cn/showproblem.php?pid=3791 建立二叉树,对比是否相同 #include <iostream> #include <cstdio> #include <cstring> using namespace std; #define lson rt<<1 #define rson rt<<1|1 int tree[2500],ttree[2500]; char str[25]; int m

HDU 3999 二叉排序树

The order of a Tree Problem Description The shape of a binary search tree is greatly related to the order of keys we insert. To be precisely:1.  insert a key k to a empty tree, then the tree become a tree with only one node;2.  insert a key k to a no

hdu 3791 二叉搜索树

简单的二叉搜索树建树过程 #include<stdio.h> #include<string.h> int tree1[1500], tree2[1500]; char s[1000], k[1000]; void build1() { int i; tree1[1] = s[0] - '0'; int y = strlen(s); for (i = 1; i < y; i++) { int now = 1; while (1) { if (tree1[now] == -1)

浙大计算机研究生复试上机考试-2010年

二叉搜索树 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3007 Accepted Submission(s): 1310 Problem Description 判断两序列是否为同一二叉搜索树序列 Input 开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束. 接下去一行是一个序列,序列长度小于10,包

POJ 1577 Falling Leaves 二叉搜索树

HDU 3791 Falling Leaves 二叉搜索树  Figure 1Figure 1 shows a graphical representation of a binary tree of letters. People familiar with binary trees can skip over the definitions of a binary tree of letters, leaves of a binary tree, and a binary search tr

HDU 5444 Elven Postman 二叉排序树

HDU 5444 题意:给你一棵树的先序遍历,中序遍历默认是1...n,然后q个查询,问根节点到该点的路径(题意挺难懂,还是我太傻逼) 思路:这他妈又是个大水题,可是我还是太傻逼.1000个点的树,居然用标准二叉树结构来存点,,,卧槽想些什么东西.可以用一维数组,left,right直接指向位置就行了,我这里用的是链表.对于读入的序列,生成一个二叉排序树,同时记录一下路径就可以了,后面居然忘了清空path又wa了一发. 1 #include<iostream> 2 #include<cs

2015 ACM/ICPC Asia Regional Changchun Online HDU 5444 Elven Postman【二叉排序树的建树和遍历查找】

Elven Postman Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 591    Accepted Submission(s): 329 Problem Description Elves are very peculiar creatures. As we all know, they can live for a very