基于二叉排序树的查找

    导论:首先,沿着二分查找的思路,我们构造一种二叉树来查找,这种二叉树的左子树结点都小于根节点,右子树节点都大于根节点,这样一来,所有结点算是都排好序了,接下来就可以查找

基于二叉排序树的查找

一.二叉排序树的定义

所谓二叉排序树是一个什么样的东西,我们得弄清楚,以下是二叉排序树的定义:

  1.若它的左子树非空,则左子树上所有节点的值都小于根节点的值

  2.若它的右子树非空,则右子树上所有结点的值都大于根节点的值

  3.它的左子树和右子树也是一颗二叉排序树

  有了定义,很多东西就都会显而易见了:

  1.二叉排序树并不是一颗完全二叉树

  2.和二叉判定树的对比:二叉判定树是一种特殊的二叉排序树,二叉判定树多了一个限定条件:左右子树的节点数目相差最多不能超过1个(小雨或等于1)

3.二叉排序树又名二叉查找树

   

  好了,到这里给出二叉排序树的定义

  

typedef struct  _TreeNode
{
	struct _TreeNode *leftNode;
	struct _TreeNode *rightNode;
	TypeData data;
}TreeNode,*TreeRoot;

  

二.二叉排序树的插入

  和堆的建立和维护类似,我们首先想解决的一个问题就是:已经有了一颗二叉排序树,怎样做到将一个值插入正确的位置,

  给出二叉树的插入定义

  

TreeNode* Insert_Tree(TreeRoot &root,TypeData key)
{
	if (!root)
	{
		TreeNode *node=new TreeNode;
		node->data=key;
		node->leftNode=nullptr;
		node->rightNode=nullptr;
		root=node;
		return root;
	}
	else if (root->data==key)
	{
		return root;
	}
	else if (root->data<key)
	{
		return (Insert_Tree(root->rightNode,key));
	}
	else if (root->data>key)
	{
		return(Insert_Tree(root->leftNode,key));
	}

}

  

这里是用递归实现的二叉排序树的插入,要注意以下几点:

    递归开始返回的终结点有两个:

                  1.当根节点为null时

                  2.根节点的data值和key相等,这个时候就不需要插入了

    插入完毕返回插入位置的结点

三.二叉排序树的建立

    所谓二叉排序树的建立,也就是通过向一个空节点不断地插入结点来建立一颗二叉排序树,通过递归地插入,可得

void Create_Tree(TreeRoot& root)
{
	TypeData key;
	while (std::cin>>key)
	{
		Insert_Tree(root,key);
	}
}

  

四.通过二叉排序树进行查找

    这里,有两种方式,递归和非递归的

    首先是递归的

TreeNode *find_InTree(TreeRoot root,TypeData key)
{
	if (root)
	{
		if (root->data==key)
		{
			return root;
		}
		else if (root->data>key)
		{
			return find_InTree(root->leftNode,key);
		}
		else
		{
			return find_InTree(root->rightNode,key);
		}
	}
	return nullptr;
}

  然后是非递归的,用while循环代替递归达到递归的作用

TreeNode *find_InTree2(TreeRoot root,TypeData key)
{
	TreeNode* p=root;
	while (p)
	{
		if (p->data==key)
		{
			return p;
			break;
		}
		else if (p->data>key)
		{
			p=p->leftNode;
		}
		else
		{
			p=p->rightNode;
		}
	}
	return nullptr;
}

  

最后,简单地分析一下查找的时间复杂度吧!

    二叉排序树的插入过程:很明显,二叉排序树过程最好情况是O(log2(n)),最差情况是O(n),最差的情况时:二叉树变为一颗只有左子树或者只有右子树的二叉树,整个插入过程也退化成为顺序插入

    二叉排序树的创建过程:很明显,假设有n个数,建立二叉排序树就要while循环n次插入过程,也就是说创建过程为O(nlog2(n))~O(n2)之间

    二叉排序树的查找过程:很明显,基于二叉排序树的查找过程和二叉排序树的插入过程类似,时间复杂度也为O(log2(n))到O(n)之间

最后,程序执行过程使这样的:

排序二叉树的创建过程;

排序二叉树的查找过程;

这样看来,整个过程的时间复杂度为O(nlog2(n)到O(n2))之间,但是实际上表述的时候我们通常忽略创建过程,只考虑二叉树的查找过程,这样看来的话,整个过程的时间复杂度为O(log2(n))到O(n)之间

 

时间: 2024-10-11 22:08:14

基于二叉排序树的查找的相关文章

基于二叉排序树的高校分数查询系统

前述:该学期最后的数据结构的课程设计选题,于是记录在自己博客中,作为自己技术成长的点滴吧. 题目:高校最低录取分数线的查询 编程实现一个开放式的高校本科招生最低分数线的查询系统,供师生及家长等查询,高校自愿放入该校的信息,可能随时有高校加入. 要求实现的查询功能有: 查询等于用户给定分数的高校 查询大于(或小于)用户给定分数的高校 查询最低录取分数线的用户给定的分数段中的高校   以上就是老师给定题目中要求实现的功能,为了是程序整体更加完整,自己对高校使用部分做了一些功能添加,例如学校信息的增删

重温数据结构:二叉排序树的查找、插入、删除

读完本文你将了解到: 什么是二叉排序树 Binary Sort Tree BST 二叉排序树的关键操作 查找 插入 删除 运行代码测试 一道面试题 总结 Thanks 我们知道,二分查找可以缩短查找的时间,但是有个要求就是 查找的数据必须是有序的.每次查找.操作时都要维护一个有序的数据集,于是有了二叉排序树这个概念. 上篇文章 我们介绍了 二叉树 的概念,二叉树有左右子树之分,想必在区分左右子树时有一定的规则. 现在我们来介绍二叉树的一种特殊形式 - 二叉排序树,了解它的区分策略及常用操作. 什

查找[2]二叉排序树以及查找

1 #include "iostream" 2 #include "iomanip" 3 #include "time.h" 4 using namespace std; 5 6 #define num 13 7 8 struct Bnode{ 9 int data; 10 Bnode *lchild; 11 Bnode *rchild; 12 }; 13 14 /* 15 *将指针S所指的结点插入到二叉排序树T中 16 */ 17 void i

_DataStructure_C_Impl:二叉排序树的查找

#include<stdio.h> #include<stdlib.h> typedef int KeyType; //元素的定义 typedef struct{ KeyType key; }DataType; //二叉排序树的类型定义 typedef struct Node{ DataType data; struct Node *lchild,*rchild; }BiTreeNode,*BiTree; //二叉排序树的查找,如果找到元素x,则返回指向结点的指针,否则返回NULL

基于数组二分查找算法的实现

基于数组二分查找算法的实现 二分查找 查找 算法 赵振江 二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好:其缺点是要求待查表为有序表,且插入删除困难.因此,折半查找方法适用于不经常变动而查找频繁的有序列表.首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功:否则利用中间位置记录将表分成前.后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表.重复以上过程,直到找到满足条件的记录,使查找成功

BST二叉排序树的查找和删除的完整C代码

二叉排序树的查找算法 假定二叉排序树的根节点指针为root,给定的关键字值为key,则查找算法可描述为: 置初值:p = root : 如果 key = p -> data ,则查找成功,算法结束: 否则,如果key < p->data ,而且 p 的左子树非空,则将 p 的左子树根送 p ,转步骤 2 :否则,查找失败,算法结束: 否则,如果 key > p->data ,而且 p 的右子树非空,则将 p 的右子树根送 p ,转步骤 2 :否则,查找失败,算法结束. //B

二叉排序树的查找、插入和删除

1.      二叉排序树 二叉排序树(Binary Sort Tree)或者是一棵空树,或者是具有下列性质的二叉树: (1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值: (2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值: (3)左.右子树也分别为二叉排序树: (4)没有结点值相同的结点. 二叉排序树又称二叉查找树(Binary Search Tree),亦称二叉搜索树.通常采用二叉链表作为二叉排序树的存储结构.中序遍历二叉排序树可以得到关键字有序的序列,即一个无序序

基于快速排序的查找前K个最大数

快速排序 下面是之前实现过的快速排序的代码. function quickSort(a,left,right){ if(left<right){ let mid=partition(a,left,right);//选出key下标 quickSort(a,left,mid-1);//对key的左半部分排序 quickSort(a,mid+1,right)//对key的右半部份排序 } } function partition(a,left,right){ let key=a[left];//一开始

基于树的查找

二叉排序树 二叉排序树或者是一颗空树 若它的左子树不空,则左子树上所有节点的值均小于它的根节点的值: 若它的右子树不空,则右子树上所有节点的值均大于其根节点的值. 左右子树分别为二叉排序树 存储结构: typedef struct node { int key;//关键字的值 struct node *lchild,*rchild;//左右指针 }BSTNode,*BSTree; 二叉排序树插入 算法思想: 若二叉排序树是空树,则key成为二叉排序树的根 若二叉排序树是非空空树,则key与二叉排