DS二叉排序树之查找

题目描述

给出一个数据序列,建立二叉排序树,并实现查找功能

对二叉排序树进行中序遍历,可以得到有序的数据序列

输入

第一行输入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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值