从前面介绍的查找方法我们知道,折半查找较顺序查找速度快,但折半查找要求表中记录必须有序,因为当在已排序的表中找到新记录恰当的位置时,需要移动许多记录以便为新记录腾出位置。有没有哪一种组织记录的方法使得记录的插入与查找都能够很快地完成呢?本篇博客介绍的树表查找就能解决这个问题。
二叉排序树(BST 也叫二叉查找树)
定义:
二叉排序树或者是一棵空树,或者是具有下列性质的二叉树:
(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
(2)若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值;
(3)左、右子树也分别为二叉排序树;
根据BST的性质可以推出,中序遍历该树所得到的是一个递增序列
样式:
即根结点大于左子树,小于等于右子树。
二叉排序树生成和结点插入
二叉排序树生成是从一个空树开始的,每插入一个关键字,就可以调用一次插入方法。所以,先写出二叉排序树的插入方法,要保证插入后满足BST的性质。
定义树结点的结构为:
//结点结构 struct node { int key;//关键字项 node * lchild; node * rchild; node() { lchild=rchild=NULL; } };插入函数代码为:
//二叉排序树节点插入 int Insert(node * &root,int key) { if(root==NULL) { root=new node; root->key=key; return 1;//插入成功 } else if(key==root->key)//已经存在 return 0;//插入失败 else if(key<root->key)//插到左子树 return Insert(root->lchild,key); else return Insert(root->rchild,key); }有了插入代码,生成二叉排序树的代码就简单了:
//二叉排序树创建 void Create(node * &root) { int a[]={8,3,10,1,6,14,4,7,13};//结点数据 for(int i=0;i<9;i++) Insert(root,a[i]);//节点插入 }至此我们就生了一棵二叉排序树如下:
需要注意的是数据顺序不同, 生成的二叉排序树可能不同,你可以试试数据
int a[]={3,8,,10,1,6,14,4,7,13};
很明显不一样,我们需要知道构造高度越小的二叉排序树,查找的效率越高
二叉排序树查找
生成二叉排序树后,我们来试试查找6这个结点,查找到就返回该结点的指针,否则返回NULL;
代码如下:
//节点查找 node * Search(node * root,int key) { if(root==NULL) return NULL; if(root->key==key) return root; if(root->key>key) return Search(root->lchild,key);//左子树查找 else return Search(root->rchild,key);//右子树查找 }从查找的平均性能来说,二叉排序树和二分查找差不多,但在维护表的有序性上,二叉排序树更有效,因为无需记录,只需修改指针。
二叉排序树删除
删除结点后,我们还要保证它的BST性质。更不能把它的子结点丢弃。这里我们很容易想到直接删除此结点和其子结点,在循环调用Insert函数把它的子结点插入进去。
另一种方法就要分四种情况讨论了:
1.若要删除的是叶子结点,直接删除该结点
2.若要删除的结点只有左子树而无右子树,可直接将其左子树的根节点放在被删除的位置
3.若要删除的结点只有右子树而无左子树,可直接将其右子树的根节点放在被删除的位置
4.若要删除的结点有左右子树,可以从其左子树种选择最大的结点或从右子树中选择最小的结点放到被删的结点的位置
根据分析,我们就能写出代码,注意使用引用类型,因为要对树本身进行操作:
int Delete(node * &root,int key) { if(root==NULL) return 0;//空树失败 else { if(root->key>key) return Delete(root->lchild,key);//递归左子树删除 else if(root->key<key) return Delete(root->rchild,key);//递归右子树删除 else//找到了key值的结点 { //删除 if(root->rchild==NULL&&root->lchild==NULL)//没有左右子树,即叶子结点,直接删除 { node * temp=root; root=NULL; delete temp; //2.delete root;能删除叶子结点,但父结点的lchild或rchild没置NULL } else if(root->rchild==NULL)//没有右子树。 { node *temp=root; root=root->lchild; delete temp; } else if(root->lchild==NULL)//没有左子树 { node *temp=root; root=root->rchild; delete temp; } //有左右子树 else { Delete2(root,root->lchild);//要用引用类型,因为要对树本身操作 } return 1; } } }
void Delete2(node * & root, node * & right)//要用引用类型,因为要对树本身操作 { node * temp; if(right->rchild!=NULL)//即找到左子树最右下的结点,即左子树最大值,此时的right指向这个最大结点 Delete2(root,right->rchild); else { root->key=right->key; temp=right; right=NULL; delete temp; } }
相关推荐
二叉排序树,又称二叉查找树或二叉搜索树,是计算机科学中一种重要的数据结构,主要用于数据的存储和检索。它具有以下特性:对于任意一个节点,其左子树中的所有节点的值都小于该节点的值,而右子树中的所有节点的值...
本文将详细探讨四种常见的查找算法:顺序查找、折半查找、二叉排序树查找以及哈希表查找,并结合提供的"综合查找算法"课程设计项目,解析其在实际应用中的特点和优势。 **顺序查找**是最基础的查找算法,适用于任何...
在C++中实现二叉排序树查找算法,通常涉及以下几个关键步骤: 1. **定义节点结构体**: 首先,我们需要定义一个表示二叉树节点的结构体,包含一个整数值和两个指向子节点的指针。 ```cpp struct TreeNode { int ...
掌握二叉排序树的存储方法,实现二叉排序树的创建、查找、插入、删除、平均查找长度等基本操作。 三、实验内容及要求 1、构造二叉排序树的存储结构。 2、实现创建、查找、插入、删除、平均查找长度等操作。
二叉排序树,又称二叉查找树或二叉搜索树,是计算机科学中一种非常重要的数据结构,主要用于高效地进行查找、插入和删除操作。它具有以下特性:对于任意一个节点,其左子树中的所有节点的值都小于该节点的值,而右子...
二叉排序树插入算法 二叉排序树插入是指在二叉排序树中插入新的数据元素的过程。二叉排序树是一种特殊的二叉树,它的每个结点的关键字都大于左子树的关键字,小于右子树的关键字。因此,在插入新的数据元素时,需要...
代码里有二叉排序树插入操作递归算法,二叉排序树插入操作非递归算法,二叉排序树删除操作,创建二叉排序树,二叉排序树查找递归算法,二叉排序树查找非递归算法
老师给的资源,对于数据结构入门的学生很有帮助的。
### 查找二叉排序树 在二叉排序树中查找特定元素的算法相当简单: 1. 从根节点开始。 2. 如果根节点的值等于目标值,返回找到的节点。 3. 如果目标值小于根节点的值,递归地在左子树中查找。 4. 如果目标值大于根...
下面,我们将介绍四种常见的查找算法:顺序查找、折半查找、二叉排序树和哈希表。 顺序查找 顺序查找是最简单的一种查找算法。它的工作原理是从数据集合的开始处依次比较每个元素,直到找到目标元素或者达到集合的...
二叉排序树(Binary Sort Tree,BST)是一种特殊的二叉树数据结构,它具有以下特性:每个...通过学习和理解二叉排序树与折半查找,我们可以有效地处理和操作有序数据,提高算法的效率,为实际问题提供高效解决方案。
这种结构使得二叉排序树在查找、插入和删除操作上有较高的效率。 在给定的场景中,我们需要用C++来处理一个文件,该文件包含不少于100个整型数,并计算这些数在二叉排序树中的平均查找长度。平均查找长度(Average ...
这种结构使得二叉排序树在查找、插入和删除操作上有很好的性能。 在实验中,首先介绍了设计人员的信息,包括姓名、专业、班级、学号,以及实验的时间和环境,如使用的软件和硬件。接着,明确了实验项目是基于二叉链...
最近在研究数据结构这本书,自己动手实现的一个二叉查找排序树的类BinSortTree,实现数据的插入,查找,删除,层序遍历,中序遍历等操作,熟悉数据结构的朋友都知道,根据二叉排序树的定义,中序遍历后得到的序列...
二叉排序树(Binary Sort Tree,BST),也称为二叉查找树或二叉搜索树,是一种自平衡的二叉树数据结构,它在处理搜索、插入和删除操作时具有较高的效率。二叉排序树的主要特性是:对于任意节点,其左子树中的所有...
根据给定文件的信息,我们可以将相关的知识点概括如下...以上是关于二叉排序树算法的基本知识点介绍,这些方法涵盖了二叉排序树的主要操作,包括插入、查找、遍历以及统计等,对于理解和实现二叉排序树具有重要的意义。
在本项目中,我们主要探讨的是“数据结构课程设计”,具体是关于二叉排序树的操作演示系统,使用C语言编程实现...通过亲手操作,可以更好地理解和运用二叉排序树的特性,为后续的算法分析和复杂数据处理打下坚实基础。
利用二叉排序树完成动态查找表的建立、指定关键字的查找、插入与删除指定关键字结点。 算法输入:指定一组数据。 算法输出:显示二叉排序树的中序遍历结果、查找成功与否的信息、插入和删除后的中序遍历结果(排序...
在完成这个项目后,你将对二叉排序树和平衡二叉排序树有深入的理解,这对后续学习高级数据结构和算法,以及实际的软件开发工作都是非常有益的。同时,这也会提升你的编程技能,特别是处理复杂数据结构的能力。