数据结构之二叉排序树

  二叉排序树的定义:二叉排序树或者是空树,或者是满足如下性质的二叉树:

  ①若它的左子树非空,则左子树上所有结点的值均小于根结点的值;
  ②若它的右子树非空,则右子树上所有结点的值均大于根结点的值;
  ③左、右子树本身又各是一棵二叉排序树。
  上述性质简称二叉排序树性质(BST性质),故二叉排序树实际上是满足BST性质的二叉树。

  如果一开始输入的序列是有序序列,则建立的类似一个单链表。

  一个非常重要的性质是二叉排序树的中序遍历为从小到大的有序序列。

#define _CRT_SECURE_NO_DEPRECATE
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#define DataType int
typedef struct BSTNode{
	DataType data;
	struct BSTNode *lchild, *rchild;
}BSTNode, *BSTree;
bool SearchBST(BSTree &T, DataType x)//递归查找是否存在某元素
{
	if (!T)
		return false;
	if (T->data == x)
		return true;
	else if (T->data > x)//转到左分支
		return SearchBST(T->lchild, x);
	else                 //转到右分支
		return SearchBST(T->rchild, x);
}
bool SearchBST1(BSTree &T, DataType x)//非递归查找是否存在
{
	BSTree p = T;
	while (T)
	{
		if (T->data == x)
			return true;
		else if (p->data > x)
			p = p->lchild;
		else
			p = p->rchild;
	}
	return false;
}
bool SearchBST2(BSTree &T,DataType x,BSTree &result, BSTree &parent)//递归查找并返回结果,所在位置
{

	if (!T)
	{
		result = parent;//不成功就返回其双亲位置,为随后添加作铺垫
		return false;
	}

	if (T->data == x)//查找成功就返回其位置指针
	{
		result = T;
		return true;
	}
	else if (T->data > x)
		return SearchBST2(T->lchild, x, result, T);//parent=T,根结点T位置赋值给参量parent
	else
		return SearchBST2(T->rchild, x, result, T);
}
bool InsertBST(BSTree &T,DataType x)//插入元素
{
	BSTree parent = NULL, result = NULL,s;//初始化参量
	if (!SearchBST2(T, x, result, parent))//如果不存在
	{
		s = (BSTree)malloc(sizeof(BSTNode));
		s->data = x;
		s->lchild = s->rchild = NULL;
		if (!result)//第一种情况空树,则根结点加入此元素
			T=s;
		else//否则利用返回的双亲结点进行添加新结点
		{
			if (result->data > x)
				result->lchild = s;
			else
				result->rchild = s;
		}
		return true;
	}
	else
		return false;
}
void CreatBST(BSTree &T,int n)//创建二叉排序树,用到了插入函数
{
	printf("请输入%d个数据:\n", n);
	int a;
	for (int i = 0; i < n; i++)
	{
		scanf("%d", &a);
		InsertBST(T, a);
	}
}
void InOrder(BSTree &T)//中序遍历
{
	if (T)
	{
		InOrder(T->lchild);
		printf("%3d", T->data);
		InOrder(T->rchild);
	}
}
void Delete(BSTree &p)//删除某结点,注意是直接改这个指针,“引用&”类型
{//分为几种情况,对照图来看代码
	BSTree  q, s;
	if (p->rchild == NULL)//第一种情况,此结点没有右孩子
	{
		q = p;
		p = p->lchild;//类似单链表删除,让其左孩子接上
		free(q);
	}
	else if (p->lchild == NULL)//第二种情况,此结点没有左孩子,与第一种情况类似
	{
		q = p;
		p = p->rchild;
		free(q);
	}
	else//第三种情况,用左分支最右下结点数据代替此结点数据,并删除最右下结点(或者用右分支最左下结点)
	{
		q = p;
		s = p->lchild;
		while (s->rchild)//找左分支最右下结点,q为此结点双亲指针
		{
			q = s;
			s = s->rchild;
		}
		p->data = s->data;//最左下结点数据代替要删数据
		if (p == q)//关键特殊情况!p就是左分支最右下结点的双亲
			q->lchild = s->lchild;
		else
			q->rchild = s->lchild;//因为s所指的结点为最右下,显然其无右孩子,直接把左分支给其双亲的
		delete(s);//释放最左下结点空间
	}
}
bool DeleteBST(BSTree &T, DataType x)//递归删除结点
{
	if (!T)
		return false;
	if (T->data == x)
	{
		Delete(T);
		return true;
	}
	else if (T->data >x)
		return DeleteBST(T->lchild,x);
	else
		return DeleteBST(T->rchild, x);
}
int main()//测试代码
{
	BSTree mytree=NULL;
	DataType x = 4;
	CreatBST(mytree, 10);
	InOrder(mytree);
	printf("\n");
	DeleteBST(mytree,x);
	InOrder(mytree);
	printf("\n");
	system("pause");
	return 0;
}

  

时间: 2024-11-09 08:07:28

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

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

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

数据结构:二叉排序树(创建二叉排序树及其中序遍历)

#include<stdio.h> #include<stdlib.h> typedef struct Node { int data; struct Node *left, *right; }Node; Node * CreateTree(int n) { int a[101],i; for(i=0;i<n;i++) scanf("%d",&a[i]); Node* t1; t1=(Node*)malloc(sizeof(Node)); t1-&

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

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

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

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

mySql---数据库索引原理及优化

一.摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等.为了避免混乱,本文将只关注于BTree索引,因为这是平常使用MySQL时主要打交道的索引,至于哈希索引和全文索引本文暂不讨论. 二.常见的查询算法及数据结构 为什么这里要讲查询算法和数据结构呢?因为之所以要建立索引,其实就是为了构建一种数据结构,可以在上面应用

(转)Mysql 索引原理及优化

本文内容主要来源于互联网上主流文章,只是按照个人理解稍作整合,后面附有参考链接. 一.摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等.为了避免混乱,本文将只关注于BTree索引,因为这是平常使用MySQL时主要打交道的索引,至于哈希索引和全文索引本文暂不讨论. 二.常见的查询算法及数据结构 为什么这里要讲查询算

数据库索引原理及优化

一.摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等.为了避免混乱,本文将只关注于BTree索引,因为这是平常使用MySQL时主要打交道的索引,至于哈希索引和全文索引本文暂不讨论. 二.常见的查询算法及数据结构 为什么这里要讲查询算法和数据结构呢?因为之所以要建立索引,其实就是为了构建一种数据结构,可以在上面应用

传指针和传指针引用的区别/指针和引用的区别(本质)

转自:http://blog.sina.com.cn/s/blog_673ef8130100imsp.html 指针传递参数本质上是值传递的方式,它所传递的是一个地址值.值传递过程中,被调函数的形式参数作为被调函数的局部变量处理,即在栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本.值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值.(这里是在说实参指针本身的地址值不会变) 而在引用传递过程中,被调函数的形式参数虽然也作为局

06: mysql索引查找原理及调优

目录 1.1 常见查找方法举例 1.2 索引数据结构设相关的计算机原理 1.3 MyISAM实现索引 1.4 InnoDB索引实现 1.5 索引使用策略 1.1 常见查找方法举例 1.顺序查找(linear search ) 1. 最基本的查询算法当然是顺序查找(linear search),也就是对比每个元素的方法,不过这种算法在数据量很大时效率是极低的. 2. 数据结构:有序或无序队列 3. 复杂度:O(n) 2.二分查找 1. 从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过