1011: 二叉排序树的实现和查找
题目描述
按照给定的关键字集合,建立二叉排序树。在建立的二叉排序树上查找指定的关键字,查找成功,输出找到该关键字比较的次数;查找不成功,输出-1.
输入
关键字个数n;
关键字集合;
要查找的关键字;
输出
查找成功输出比较的次数,否则输出-1。
样例输入
12
25 18 46 2 53 39 32 4 74 67 60 11
74
样例输出
4
思路:
- 将数据以二叉树形式存储(比结点大的在一边,比结点小的在另一边)
- 查找数据,若目标数据大于结点数据则在一边查找,否则在另一边查找
#include<bits/stdc++.h>
using namespace std;//若用C这行可不要
int k=0;
typedef struct tree
{
char data;
struct tree *lchild, *rchild;
}tree;
void creat(tree *&t, int data)//种树,把数据(果子)种到树上以便比较
{
if(t==NULL)//结点为空,则说明这个结点是可以放数据(果子)的
{
t=new tree();//类似于t=(tree *)malloc(sizeof(tree));
t->data=data;
t->lchild=t->rchild=NULL;//把左右孩子置空以便待会儿放数据(果子)
}
else if(data<t->data) creat(t->lchild, data);//比该结点的数据(果子)小,放到左孩子上
else if(data>t->data) creat(t->rchild, data);//比该结点的数据(果子)大,放到右孩子上
}
tree *find(tree *&t, int data)
{
k++;//记录比较次数
if(t==NULL) return NULL; //查找不成功
else if(t->data==data) return t;//查找成功
else if(data<t->data) find(t->lchild, data);//比该结点的数据(果子)小,左孩子上找
else if(data>t->data) find(t->rchild, data);//比该结点的数据(果子)大,右孩子上找
}
int main()
{
tree *t;
int n, data;
t=NULL;
cin >> n;//scanf("%d", &n);
for(int i=0;i<n;i++)
{
cin >> data;
creat(t, data);//scanf("%d", &data);
}
cin >> data;//scanf("%d", &data);
if(find(t, data)==NULL) cout<<"-1";//类似于printf("-1");
else cout << k;//类似于printf("%d", k);
return 0;
}
以上方法仅供参考,欢迎互联网的广大朋友们提出指正。