14-动态查找与查找二叉树-
题目描述
给出一个数据序列,建立二叉排序树,并实现查找功能
对二叉排序树进行中序遍历,可以得到有序的数据序列
输入
第一行输入t,表示有t个数据序列
第二行输入n,表示首个序列包含n个数据
第三行输入n个数据,都是自然数且互不相同,数据之间用空格隔开
第四行输入m,表示要查找m个数据
从第五行起,输入m行,每行一个要查找的数据,都是自然数
以此类推输入下一个示例
输出
第一行输出有序的数据序列,对二叉排序树进行中序遍历可以得到
从第二行起,输出查找结果,如果查找成功输出查找次数,如果查找失败输出-1
以此类推输出下一个示例的结果
输入样例
1
6
22 33 55 66 11 44
7
11
22
33
44
55
66
77
输出样例
11 22 33 44 55 66
2
1
2
4
3
4
-1
#include<iostream>
using namespace std;
struct node
{
int data;
struct node *lchild;
struct node *rchild;
};
class BSTtree
{
int sum;//查找次数
node tree[20];
public:
BSTtree()
{
tree->data=-1;
tree->lchild=tree->rchild=NULL;
}
void creattree()
{
int n,i,e,m;
cin>>n;
for(i=0;i<n;i++)
{
cin>>e;
if(tree->data==-1)
tree->data=e;
else
insert(tree,e);
}
inorder(tree);
cout<<endl;//对二叉排序树进行中序遍历->输出有序的数据序列
cin>>m;//查找成功输出查找次数
for(i=0;i<m;i++)
{
sum=0;
cin>>e;
if(search(tree,e)==-1)//查找不成功
cout<<"-1"<<endl;
else
cout<<sum<<endl;
}
}
void insert(node *p,int e)
{
node *x=new node();
if(e>p->data && p->rchild==NULL)//没有子树直接插入
{
x->data=e;
x->lchild=x->rchild=NULL;
p->rchild=x;
}
else if(e<p->data && p->lchild==NULL)
{
x->data=e;
x->lchild=x->rchild=NULL;
p->lchild=x;
}
else if(e>p->data && p->rchild!=NULL)//有子树递归
insert(p->rchild,e);
else if(e<p->data && p->lchild!=NULL)
insert(p->lchild,e);
}
void inorder(node *p)//中序遍历
{
if(p->lchild!=NULL)
inorder(p->lchild);
cout<<p->data<<" ";
if(p->rchild!=NULL)
inorder(p->rchild);
}
int search(node *p,int e)//查找->用递归
{
sum++;
if(e==p->data)
return 1;
else if(e>p->data)
{
if(p->rchild==NULL)
return -1;
else
search(p->rchild,e);
}
else if(e<p->data)
{
if(p->lchild==NULL)
return -1;
else
search(p->lchild,e);
}
//return 1;
}
};
int main()
{
int t;
cin>>t;
while(t--)
{
BSTtree T;
T.creattree();
}
return 0;
}