二叉排序(查找)树

1、定义

二叉排序树或者是一棵空树,或者是具有下列性质的二叉树

(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;

(2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;

(3)左、右子树也分别为二叉排序树;

(4)没有键值相等的节点。

2、基本性质:

(1)就是若它的左子树不空,则左子树上所有节点的值均小于它的根节点的值; 
(2)若它的右子树不空,则右子树上所有节点的值均大于其根节点的值。 
(3)换句话说就是:任何节点的键值一定大于其左子树中的每一个节点的键值,并小于其右子树中的每一个节点的键值。

 (4)二叉排序树的中序遍历等于一串数的的从小到大的排序。

(5)二叉排序树的最小元素是最左孩子的左结点,最大元素是最右孩子的右节点。

3、基本操作:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;

struct Node{
	int data;
	struct Node *Left,*Right;
};
typedef struct Node* BST;

//查找 
//f为指向t的双亲初始值为NULL;如果查找成功,p指向该数据元素的结点,并返回true,否则返回查找的最后一个节点,返回false 
bool Search(BST t,int x,BST f,BST *p)
{
	if(!t)
	{
		*p=f;
		return false;
	}
	else if(x==t->data)
	{
		*p=t;
		return true;
	}
	else if(x<t->data) return Search(t->Left,x,t,p);
	else return Search(t->Right,x,t,p);
} 

//插入
bool Insert(BST *t,int x)
{
	BST p,s;
	if(!Search(*t,x,NULL,&p))
	{
		s=new Node;
		s->data=x;
		s->Left=s->Right=NULL;
		if(!p) *t=s;
		else if(x<p->data) p->Left=s;
		else p->Right=s;
		return true; 
	}
	else return false;
}

//删除
bool Delete(BST p)
{
	BST q,s;
	if(p->Left==NULL) 
	{
		q=p;p=p->Left;delete q;
	}
	else if(p->Right==NULL)
	{
		q=p;p=p->Right;delete q;
	}
	else
	{
		q=p;s=p->Left;
		while(s->Right)
		{
			q=s;s=s->Right;
		}
		p->data=s->data;
		if(q!=p) q->Right=s->Left;
		else q->Left=s->Left;
		delete s;
	}
	return true;
}
bool DeleteBST(BST t,int x)
{
	if(t==NULL) return false;
	else
	{
		if(x==t->data) return Delete(t);
		else if(x<t->data) return DeleteBST(t->Left,x);
		else return DeleteBST(t->Right,x);
	}
}
vector <int> v;
void inorder(BST t,vector <int> &vc) //二叉搜索树的中序遍历是它从小到大排列。 
{
	
	if(t->Left!=NULL) inorder(t->Left,vc);
	vc.push_back(t->data);
	if(t->Right!=NULL) inorder(t->Right,vc);
}
int main(void)
{
	int i;
	int a[10]={3,4,1,2,5,6,7,9,8,10};
	BST t=NULL;
	for(i=0;i<10;i++)
	{
		Insert(&t,a[i]);
	}
	inorder(t,v);
	for(i=0;i<10;i++) printf("%d ",v[i]);
	return 0;
}

参考文章:https://blog.csdn.net/yixianfeng41/article/details/52802855

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值