题目描述
给出一个数据序列,建立二叉排序树,并实现查找功能
对二叉排序树进行中序遍历,可以得到有序的数据序列
输入
第一行输入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;
int flag,cnt;
class Node {
public:
int data;
Node *left,*right;
Node() {
left = right =NULL;
}
Node(int _data){
data = _data;
left = right =NULL;
}
~Node(){
}
};
class Tree {
public:
Node *root;
Tree() {
root = NULL;
}
};
void insert(Node *&node,int data){
if(node == NULL){
node = new Node(data);
return ;
}
if(node->data < data){
insert(node->right,data);
}else{
insert(node->left,data);
}
}
void search(Node *node, int data){
cnt++; //记录查找次数
if(node == NULL) return ;
if(data == node->data){
flag = 1;//记录是否找到目标位置
return ;
}
if(data < node->data){
search(node->left,data);
}else{
search(node->right, data);
}
}
void output(Node *node){
if(node == NULL) return ;
output(node->left);
cout<<node->data<<" ";
output(node->right);
return ;
}
int main() {
int t;
cin>>t;
Tree tree;
while(t--) {
int n;
cin>>n;
while(n--) {
int data;
cin>>data;
insert(tree.root,data);
}
output(tree.root);
cout<<endl;
int m;
cin>>m;
while(m--) {
int data;
cin>>data;
cnt = flag = 0;
search(tree.root,data);
if(flag){
cout<<cnt;
}else{
cout<<-1;
}
cout<<endl;
}
}
return 0;
}