题目描述
给出一个数据序列,建立二叉排序树,并实现查找功能
对二叉排序树进行中序遍历,可以得到有序的数据序列
输入
第一行输入t,表示有t个数据序列
第二行输入n,表示首个序列包含n个数据
第三行输入n个数据,都是自然数且互不相同,数据之间用空格隔开
第四行输入m,表示要查找m个数据
从第五行起,输入m行,每行一个要查找的数据,都是自然数
以此类推输入下一个示例
输出
第一行输出有序的数据序列,对二叉排序树进行中序遍历可以得到
从第二行起,输出查找结果,如果查找成功输出查找次数,如果查找失败输出-1
以此类推输出下一个示例的结果
输入样例1
1
6
22 33 55 66 11 44
7
11
22
33
44
55
66
77
输出样例1
11 22 33 44 55 66
2
1
2
4
3
4
-1
NOTICE:
二叉排序树的查找:根据待查元素的大小走这棵树,若当前结点的值等于待查元素的大小,查找成功,若走到了空指针,说明查找失败;
#include <iostream>
using namespace std;
class BiTreeNode
{
private:
int data;
BiTreeNode* lchild;
BiTreeNode* rchild;
public:
BiTreeNode(int a)
{
data = a;
lchild = nullptr;
rchild = nullptr;
}
friend class BiTree;
};
class BiTree
{
private:
BiTreeNode* root;
void inorder(BiTreeNode* t)
{
if (t)
{
inorder(t->lchild);
cout << t->data << " ";
inorder(t->rchild);
}
}
public:
BiTree() :root(nullptr) {}
void insert(int num)
{
BiTreeNode* t = new BiTreeNode(num);
if (root == nullptr)
{
root = t;
}
else
{
BiTreeNode* p = root;
BiTreeNode* q = nullptr;//指向p节点的双亲
while (1)
{
if (p == nullptr)
{
if (num < q->data)
{
q->lchild = t;
}
else if (num > q->data)
{
q->rchild = t;
}
break;
}
if (num < p->data)
{
q = p;
p = p->lchild;
}
else if (num > p->data)
{
q = p;
p = p->rchild;
}
}
}
}
void search(int num)
{
BiTreeNode* p = root;
int count = 0;
while (1)
{
count++;
if (p == nullptr)//没找到
{
cout << "-1" << endl;
break;
}
if (p->data == num)//找到
{
cout << count << endl;
break;
}
if (num < p->data)
{
p = p->lchild;
}
else if (num > p->data)
{
p = p->rchild;
}
}
}
void inorder()
{
inorder(root);
cout << endl;
}
};
int main()
{
int t;
cin >> t;
while (t--)
{
int n, m;
BiTree tree;
//创建二叉树(本质是多次插入)
cin >> n;
for (int i = 0; i < n; i++)
{
int num;
cin >> num;
tree.insert(num);
}
tree.inorder();
//查找
cin >> m;
for (int i = 0; i < m; i++)
{
int num;
cin >> num;
tree.search(num);
}
}
return 0;
}