[数据结构]二叉排序树

在数据的查找这个问题上,如果查找的数据集是有序线性表,并且是顺序存储的,查找可以使用折半、插值、斐波那契等查找算法实现,可惜,因为有序,在插入和删除操作上,就需要耗费大量的时间。

那么有没有一种可以使得插入和删除的效率不错,又可以比较高效地实现查找的算法呢?也就是说有没有一种算法能够使用与动态查找。

动态查找:在查找时插入或者删除的查找表称为动态查找表。

所以就引入了二叉排序树,它是这样的一个二叉树:

  • 左子树上的所有结点的值小于它的根结点的值;
  • 右子树上的所有结点的值大于它的根结点的值;
  • 它的左子树和右子树同样也是一颗二叉排序树。

根据上面的性质可以知道,对这棵二叉排序树中序遍历就得到了一个升序的序列。但是构造一个二叉排序树的目的,并不是为了排序,而是为了提高查找和插入删除的速度

代码实现

树结构结点定义:

typedef struct BiTNode
{
	int data;
	struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;

查找实现:查找成功,返回查找到的结点的指针,查找不成功,返回查找路径上最后的一个结点。

//f是当前根结点T的父结点,当查找失败时返回这个父结点
bool SearchBST(BiTree T, int key, BiTree f, BiTree *p)
{
	if (T == NULL)	//递归查找不成功
	{
		*p = f;
		return false;
	}

	if (T->data == key)	//查找成功
	{
		*p = T;
		return true;
	}
	else if (key < T->data)
	{
		return SearchBST(T->lchild, key, T, p);	//左子树递归查找
	}
	else
	{
		return SearchBST(T->rchild, key, T, p);	//右子树递归查找
	}
}

  这里为什么要返回查找路径上的最后一个结点:因为在插入操作的时候,也需要用到查找,而插入的点正好是查找路径上的最后一个结点也就是把要插入的结点作为这个最后结点的孩子。

//插入新结点的时候,要先查找,找到应该插入的位置
bool InsertBST(BiTree *T, int key)
{
	BiTree p, s;
	if (!SearchBST(*T, key, NULL, &p))	//查找不成功,可以插入
	{
		s = (BiTNode*)malloc(sizeof(BiTNode));
		s->data = key;
		s->lchild = s->rchild = NULL;

		if (p == NULL)
		{
			*T = s;
		}
		else if(p->data > key)
		{
			p->lchild = s;
		}
		else
		{
			p->rchild = s;
		}

		return true;
	}
	else	//查找成功,要插入的元素已经存在,插入失败
	{
		return false;
	}
}

  

时间: 2024-10-18 03:44:06

[数据结构]二叉排序树的相关文章

(编程训练)再回首,数据结构——二叉排序树的建立

最近在复习数据结构,顺便看看大一的时候写的代码,看完之后比当初有了更加深刻的体会. 希望这些能提供给初学者一些参考. 在VC++6.0下可运行,当初还写了不少注释. [问题描述] 以输入的一组整数作为关键字的值,构造其对应的二叉排序树,并对给点的值在该二叉排序树上进行查找 [基本要求] ·输入:输入一组关键字(整数)及要查找的值 ·输出:排好序的关键字及查找的结果 样例输入 60 35 69 84 96 13 66 34 21 -1 40 样例输出 13 21 34 35 60 66 69 84

大话数据结构—二叉排序树

二叉排序树(Binary Sort Tree),又称二叉查找树.它或者是一颗空树,或者是具有下列性质的二叉树. 若它的左子树不空,则左子树上所有节点的值都小于它的根节点的值: 若它的右子树不空,则右子树上所有节点的值都大于它的根节点的值: 它的左.右子树也分别为二叉排序树. 上面就是一棵二叉排序树,当我们对它进行中序遍历时,就可以得到一个有序的序列{35,37,47,51,58,62,73,88,93,99}. 构造一颗二叉排序树,不是为了排序,而是为了提高查找和插入删除关键字的速度. 二叉排序

数据结构 二叉排序树 操作及实现

#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> using namespace std; typedef struct Bitnode { int data; struct Bitnode *lchild,*rchild; } Bitnode,*Bitree; int Searchtree(Bitree T,int num,Bitree F,Bitree &

数据结构 - 二叉排序树的实现

二叉排序树(Binary Sort Tree)又称二叉查找树(Binary Search Tree),亦称二叉搜索树.  它或者是一棵空树:或者是具有下列性质的二叉树:  (1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值:  (2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值:  (3)左.右子树也分别为二叉排序树: 上机代码: #include <cstdio> #include <cstring> #include <algorithm>

(考研)(精华)二叉树的知识结构图以及各种特殊的二叉树

关于二叉树有一点需要注意:二叉树并不是树的一种特殊形式. 二叉树又有几种特殊的形式:二叉排序树(二叉查找树).最优二叉树(哈弗曼树).二叉堆(大顶堆,小顶堆)等.斜线是数据结构 二叉排序树(二叉查找树)(BST)它或者是一棵空树:或者是具有下列性质的二叉树:(常用二分查找) 1,若左子树不空,则左子树上所有结点的值均小于它的根结点的值: 2,若右子树不空,则右子树上所有结点的值均大于它的根结点的值: 3,左.右子树也分别为二叉排序树: 特有的性质:对于每个结点,左孩子均小于它,右孩子均大于它 A

经典排序算法总结和比较

排序算法可以说是一项基本功,解决实际问题中经常遇到,针对实际数据的特点选择合适的排序算法可以使程序获得更高的效率,有时候排序的稳定性还是实际问题中必须考虑的,这篇博客对常见的排序算法进行整理,包括:插入排序.选择排序.冒泡排序.快速排序.堆排序.归并排序.希尔排序.二叉树排序.计数排序.桶排序.基数排序. 代码都经过了CodeBlocks的调试,但是很可能有没注意到的BUG,欢迎指出. 比较排序和非比较排序 常见的排序算法都是比较排序,非比较排序包括计数排序.桶排序和基数排序,非比较排序对数据有

【数据结构】简单谈一谈二分法和二叉排序树BST查找的比较

二分法查找: 『在有序数组的基础上通过折半方法不断缩小查找范围,直至命中或者查询失败.』 二分法的存储要求:要求顺序存储,以便于根据下标随机访问 二分法的时间效率:O(Log(n)) 二分法的空间效率:原地查询 O(1) 二分法对应的搜索树是确定的. 二叉排序树查找: 『借助二叉排序树进行搜索,但因为所建立的树本身不一定是轴对称的,所以每次比较并不能确保减小一半范围.』 二叉树的存储要求:需要树形结构,相比顺序存储需要占用更多的空间,但也有链接型数据结构灵活可拓展的有点. 二叉排序树查找的时间复

【数据结构】平衡二叉排序树BBST之AVL树

平衡二叉排序树 平衡二叉排序树(Balanced Binary Sort Tree),上一篇博客[数据结构]二叉排序树BST讲了BST,并且在最后我们说BST上的操作不会超过O(h),既然树高这么重要,那么BBST的研究就是为了使得树的深度在可接受的范围内渐近意义下达到O(lgn) n个节点组成的二叉树,其高度为lgn取下限时,这棵树是理想平衡的,满足这样条件的树只有完全二叉树和满二叉树,这样的要求未免太苛刻,并且实际中没有意义. 适度平衡:保证树高在渐近意义上不超过O(lgn)适度平衡的树也称

数据结构学习之二叉排序树

介绍:二叉排序树是以一定的规则排列树中元素,因而可以进行快速的排序和查询的树状数据结构,一般规则是:对于树中任意一个节点,左孩子严格小于根,根严格小于右孩子,有点像大根堆.(只是大根堆中左右孩子关系并不确定,且和根的关系是统一的,而且有上浮和下沉操作使得大根堆总是一棵完全二叉树,其不断弹出堆顶形成有序列的过程叫做堆排序.虽然二叉排序树中也有旋转操作使得树尽量平衡,但是由于数值大小分明的左右孩子,在进行平衡操作时远不如大根堆方便快捷.)对于一棵已经构造完成的排序二叉树,它的中序遍历序列即为升序排列