首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >二叉排序树的查找

二叉排序树的查找

作者头像
大忽悠爱学习
发布2021-11-15 10:12:01
发布2021-11-15 10:12:01
3080
举报
文章被收录于专栏:c++与qt学习c++与qt学习

二叉排序树的查找过程

二叉排序树查找的伪代码

第一种写法:

代码语言:javascript
复制
//递归三要素:
//1.结束条件:未找到 找到
//2.递归内容:比较大小,决定去左还是右子树里面查找
//3.返回值:没找到,返回双亲节点  找到,返回对应节点
BiNode* searchBST(BiNode* root, int key)
{
	if (root == NULL)
		return root;
	if(root->data==key)
		return root;
	return key<(root->data)? searchBST(root->lchild, key):searchBST(root->rchild,key);
}

第二种写法:

代码语言:javascript
复制
//递归中:T是当前节点   f是当前节点的双亲节点   
//如果没查到Key值,p记录的是最后一次访问的节点
//如果查到key值,p记录的是找到的节点
bool searchBST(BiNode* T, int key, BiNode* f, BiNode*& p)//这里p要用引用或二级指针,否则最后回溯返回的时候,返回的是初始值
//而我们要返回的是查找顶点的双亲节点
{
	//递归三要素:
	//1.结束条件:查到到空节点,查无此值   查到节点
	//2.递归内容:比较大小,进入左子树或者右子树进行查找
	//3.返回值:真或假
	if (!T)
	{
		p = f;
		return false;
	}
	if (T->data == key)
	{
		p = T;
		return true;
	}
	if (key < T->data)
	{
		return searchBST(T->lchild, key, T, p);
	}
	else 
	{
		return searchBST(T->rchild, key, T, p);
	}
}

性能分析

完整代码

代码语言:javascript
复制
#include<iostream>
using namespace std;
struct BiNode {
	int data;
	BiNode* lchild;
	BiNode* rchild;
	BiNode(int key):data(key),lchild(NULL),rchild(NULL){}
};
//递归三要素:
//1.结束条件:未找到 找到
//2.递归内容:比较大小,决定去左还是右子树里面查找
//3.返回值:没找到,返回双亲节点  找到,返回对应节点
BiNode* searchBST(BiNode* root, int key)
{
	if (root == NULL)
		return root;
	if(root->data==key)
		return root;
	return key<(root->data)? searchBST(root->lchild, key):searchBST(root->rchild,key);
}
void insertBST(BiNode*& root, int key)
{
	//如果为空树,就进行初始化
	//或者找到了合适的插入位置
	if (root == NULL)
	{
		root = new BiNode(key);
	}
	else
	{
		//如果不为空树,进行插入的时候需要比较大小
		//左小右大--左子树都小于根节点,右子树都大于根节点

		//递归三要素:结束条件 干什么 返回值 (只考虑当前层做什么,不展开考虑)
		//1.当发现当前遍历到的节点为空,结束递归
		//2.通过比较大小,寻找合适的插入位置
		//3.无返回值
		if (key < root->data)
		{
			insertBST(root->lchild, key);
		}
		else
		{
			insertBST(root->rchild, key);
		}
	}
}
//二叉树中序遍历得到二叉树的有序序列
void display(BiNode* root)
{
	//结束条件:当前节点为空
	if (!root)return;
	//干什么:中序遍历
	display(root->lchild);
	cout << root->data << " ";
	display(root->rchild);
}
//二叉树的构建
void BiSortTree(int v[], int len)
{
	BiNode* root = NULL;
	for (int i = 0; i < len; i++)
	{
		insertBST(root, v[i]);
	}
	display(root);
	cout << endl;
	BiNode* ret = searchBST(root, 58);
	cout << "下面查找key为58的值,如果找到就打印输出:" << endl;
	cout << ret->data << endl;
}
//测试-------------------
void test()
{
	int v[10] = { 62,88,58,47,35,73,51,99,37,93 };
	BiSortTree(v, 10);
}
int main()
{
	test();
	system("pause");
	return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/04/01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 二叉排序树的查找过程
  • 二叉排序树查找的伪代码
  • 性能分析
  • 完整代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档