题目描述
二叉排序树或者是一棵空树,或者是具有以下几条性质的二叉树:
1. 若它的左子树不空,则左子树上所有结点的值均小于它的根节点的值;
2. 若它的右子树不空,则右子树上所有结点的值均大于它的根节点的值;
3. 它的左右子树也分别为二叉排序树。
二叉排序树又可以被称为二叉查找树,根据上述定义的结构不难知道,它的查找过程十分简单,只需要通过不断的将当前结点的值与需要查找的值进行比较,如果相等则直接输出,如果要查找的值更小则深入至左子树进行比较,否则就深入右子树进行比较,直到找到相应的值或者进入了一棵不存在的子树为止。
在本题中,读入一串整数,首先利用这些整数构造一棵二叉排序树。另外给定多次查询,利用构造出的二叉排序树,判断每一次查询是否成功。
输入
输入的第一行包含2个正整数n和k,分别表示共有n个整数和k次查询。其中n不超过500,k同样不超过500。
第二行包含n个用空格隔开的正整数,表示n个整数。
第三行包含k个用空格隔开的正整数,表示k次查询的目标。
输出
只有1行,包含k个整数,分别表示每一次的查询结果。如果在查询中找到了对应的整数,则输出1,否则输出0。
请在每个整数后输出一个空格,并请注意行尾输出换行。
样例输入 Copy
1 3 5 7 8 9 10 15
9 2 5
样例输出 Copy
1 0 1
代码如下;
#include<iostream>
#include<cstdlib>
#include<cstdio>
using namespace std;
#define ENDFLAG 0
typedef int KeyType;
typedef struct BSTNode{
KeyType data;//节点的数据域
struct BSTNode *lchild,*rchild; //左右孩子指针
}BSTNode,*BSTree;
void InsertBST(BSTree &T,KeyType e)
{//当二叉排序树T不存在关键字等于e.key的数据元素时,插入该元素
BSTree S;
if(T==NULL)
{ //找到插入位置,递归结束
S=new BSTNode; //生成新节点*S
S->data =e ;
S->lchild =S->rchild =NULL; //新节点作为叶子结点
T=S; //把新结点*S链接到已找到的插入位置
}
else if(e <T->data ) InsertBST(T->lchild,e);
else if(e >T->data ) InsertBST(T->rchild,e);
}
void CreateBST(BSTree &T)//BST的创建
{
KeyType e;
cin>>e;
InsertBST(T,e);
}
int SearchBST(BSTree T,KeyType key) //递归查找
{
if(!T) return 0;
else if(key==T->data )
return 1;
else if(key<T->data )
return SearchBST(T->lchild ,key);
else
return SearchBST(T->rchild,key);
}
int main()
{
unsigned int n,k;
int m;
BSTree T;
T=NULL;
KeyType key;
cin>>n>>k;
for(int i=0;i<n;++i)
{
CreateBST(T);
}
for(int i=0;i<k;++i)
{
cin>>key;
m=SearchBST(T,key);
cout<<m<<" ";
}
return 0;
}