您的位置:首页 > 编程语言 > PHP开发

HDU 3791 二叉搜索树

2011-08-02 14:26 211 查看

二叉搜索树

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 218    Accepted Submission(s): 96


[align=left]Problem Description[/align]
判断两序列是否为同一二叉搜索树序列
 

 

[align=left]Input[/align]
开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束。

接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。

接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。
 

 

[align=left]Output[/align]
如果序列相同则输出YES,否则输出NO

 

 

[align=left]Sample Input[/align]

2
567432
543267
576342
0

 

 

[align=left]Sample Output[/align]

YES
NO

 

 

[align=left]Source[/align]
浙大计算机研究生复试上机考试-2010年

 

 

[align=left]Recommend[/align]
notonlysuccess
 

睇个名就知道同埋二叉树有关………………

其实思路好简单,按顺序插入数字之后,再用二叉树先、中序或者,中、后序表达式判断两颗二叉树系唔系相同,原理可以问百度谷歌维基。

其实可以拿我博客果篇多功能二叉树直接模版过,不过我换左一种写法…………

 

下面贴代码:

43127162011-08-02 14:19:44Accepted37910MS208K1416 BC++10SGetEternal{(。)(。)}!
 

#include <iostream>
#include <string>
using namespace std;
#define MAXI 11

class BST
{
public :
struct node
{
int key;
node *son[2];
} *root, space[3 * MAXI];
int id;
void Init() { root = NULL; id = 0; }
void Bulid(char *s)
{
int i;
Init();
for (i = 0; i < strlen(s); i++)
Insert(s[i]);
}
void Create(node *&x, int key)
{
x = &space[id++];
x->key = key;
x->son[0] = NULL;
x->son[1] = NULL;
}
void Insert(int key)
{
bool lr;
node *x = root, *y, *w;
if (root == NULL)
{ Create(root, key); return ; }
while (x != NULL)
{
y = x;
lr = key > x->key;
x = x->son[lr];
}
Create(w, key);
y->son[lr] = w;
}
void Ftra(node *x, string &s)
{
if (x == NULL) return ;
s += x->key;
Ftra(x->son[0], s);
Ftra(x->son[1], s);
}
void Mtra(node *x, string &s)
{
if (x == NULL) return ;
Mtra(x->son[0], s);
s += x->key;
Mtra(x->son[1], s);
}
bool operator == (BST o)
{
string s1, s2;
Ftra(root, s1);
Ftra(o.root, s2);
if (s1 != s2) return 0;
Mtra(root, s1);
Mtra(o.root, s2);
if (s1 != s2) return 0;
return 1;
}
}zkl, tzk;

int main()
{
int n;
char ch[MAXI];

while (scanf("%d", &n), n)
{
scanf("%s", ch);
zkl.Bulid(ch);
while (n--)
{
scanf("%s", ch);
tzk.Bulid(ch);
puts(zkl == tzk? "YES": "NO");
}
}

return 0;
}


 

其实关于二叉树,可以出得更加水

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息