问题描述
给定一个二叉搜索树(广义表形式)以及某个整数x,检查x是否在二叉搜索树上。
输入
输入第一行是二叉搜索树的的广义表表示。该行最长不超过2000000个字符。
第二行是一个正整数n,表示有n个测试。
接下来每行一个整数x。
输出
输出总共n行,如果x在二叉搜索树上,输出yes,否则输出no。
输入样列
6(3(1(,2),5(4,)),127)
3
5
8
127
输出样例
yes
no
yes
#include<bits/stdc++.h>
using namespace std;
typedef int ElementType;
typedef struct Node{
ElementType data;
struct Node *lchild;
struct Node *rchild;
}BSTNode, *BSTree;
BSTree createTree(char s[])
{
BSTree f[1010],p;
BSTree B=NULL;
int top=0,k=0;
for(int i=0;s[i]!='\0';i++){
if(isalpha(s[i])){
p=new BSTNode;
p->data=s[i];
p->lchild=NULL;
p->rchild=NULL;
if(B==NULL){
B=p;
}
if(k==1){
f[top]->lchild=p;
}
if(k==2){
f[top]->rchild=p;
}
}
else if(s[i]=='('){
top++;
f[top]=p;
k=1;
}
else if(s[i]==','){
k=2;
}
else if(s[i]==')'){
top--;
}
}
return B;
}
BSTNode* findMin(BSTree bst)
{
BSTree p=bst;
if(bst==NULL){
return NULL;
}
while(p->lchild!=NULL){
p=p->lchild;
}
return p;
}
BSTNode* findMax(BSTree bst)
{
BSTree p=bst;
if(bst==NULL){
return NULL;
}
while(p->rchild!=NULL){
p=p->rchild;
}
return p;
}
BSTNode* find(BSTree bst, ElementType x)
{
if(bst==NULL) return NULL;
else if(x<bst->data) return find(bst->lchild,x);
else if(x>bst->data) return find(bst->rchild,x);
else return bst;
}
void printTree(BSTree bt)
{
if(bt!=NULL){
printf("%c",bt->data);
if(bt->lchild!=NULL||bt->rchild!=NULL){
printf("(");
printTree(bt->lchild);
printf(",");
printTree(bt->rchild);
printf(")");
}
}
}
int main()
{
int n,a,i;
char str[2000000];
BSTNode *t,*k;
gets(str);
t=createTree(str[2000000]);
for(i=0;i<n;i++){
cin >> a;
k=find(t,a);
if(k!=NULL) puts("yes");
else puts("no");
}
return 0;
}