前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >二叉排序树

二叉排序树

作者头像
用户2965768
发布2018-12-27 15:39:38
3720
发布2018-12-27 15:39:38
举报
文章被收录于专栏:wymwym

二叉排序树(Binary Sort Tree)

性质:

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

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

3.它的左右子树也分别为二叉排序树

操作:

1.插入,若一个元素比当前结点小,插入左边,反之插入右边

2.删除

   1)删除结点有左右孩子,找到这个结点右子树中最小的替代当前结点

    2)删除结点有左孩子或右孩子,找到当前结点的直接前驱(父亲结点),若删除结点为其左孩子,则删除结点的左孩子作为其左孩子,右孩子同理

    3)叶子节点,找到前驱直接删除

注意问题

1.删除结点为根节点没有前驱

2.有左右孩子若右孩子只有一个如何替代

代码语言:javascript
复制
#include <bits/stdc++.h>
using namespace std;
struct node{
	int n;
	struct node *lc,*rc;
};
node *getnum(node *root,int a)
{
	if(root == NULL)return NULL; 
	node * T = root;
	while(T)
	{
		if(a > T->n)
		{
			T = T->rc;
		}else if(a < T->n)
		{
			T = T->lc;
		}else if(a == T->n)
		{
			return T;
		}
    }
    return NULL;
} 
void Insert(node *&root,int a)
{

	node *p =new node;
	p->lc = NULL; 
	p->rc = NULL;
	p->n = a;
	if(root == NULL)
	{
		root = p;
		return ;
	}
	
	if(getnum(root,a) != NULL)return;//这个数在二叉查找树中已经存在 
	
	node * T = NULL;
	node * N = root;

	while(N!=NULL)
	{
	
		T = N;
		if(a > N->n)
		N = N->rc;
		else N = N->lc;
    
	}
	if(a < T->n)  T->lc = p;
	else if(a > T->n) T->rc = p;
 	return ;
}
void dele(node *&root,int a)
{
		if(root == NULL)return ; 
	node * T = root;
	node * LT = NULL; 
	int nf=-1;
	while(T)
	{
		if(a > T->n)
		{
			LT = T;
			T = T->rc;
			nf = 0;
		}else if(a < T->n)
		{
			LT = T;
			T = T->lc;
			nf = 1;
		}else if(a == T->n)
		{
			
		     if(T->lc&&T->rc)//有左右子树 
		     {
		     	node * rmin = T->rc;//找T中右子树最小的代替T的位置 
		     	node * rrmin = NULL;
		     	while(rmin->lc)
		     	{
		     		if(rmin->lc!=NULL)rrmin= rmin,rmin = rmin->lc;
				}
				
				if(LT!=NULL)//若非根节点,找直接前驱 
				{
				if(nf)LT->lc = rmin;
				else LT->rc = rmin;
				} 
				
				if(rrmin==NULL)
				{
					rmin->lc = T->lc;
					rmin->rc =NULL;
				}
				else 
				{
				rmin->lc = T->lc;
		     	rmin->rc = T->rc;
				rrmin->lc = NULL;
				if(LT==NULL)root = rmin;//删除的是根节点  
			    }
				 
		     	free(T);
		     	return ;
		     	
			 }else if(T->lc||T->rc)
			 {
			 	if(nf&&T->lc)LT ->lc = T->lc;//n = 1 表示 T是LT的左子树 
			 	else if(nf&&T->rc) LT->lc = T->rc;
			 	else if(T->lc) LT->rc = T->lc;
			 	else if(T->rc) LT->rc = T->rc;
			 	free(T);
			 	return ;
			 }else
			 {
			 	if(nf)LT->lc = NULL;
			 	else LT->rc = NULL;
			 	free(T);
			 	return ;
			 }
		}
    }
	
}
void build_tree(node *&root,int &num)
{
	int arr[11] = {17,12,19,10,15,18,25,8,11,13,16};
	int n = 11;

	for(int i=0;i<n;i++)
	{
		Insert(root,arr[i]);
		num++;
	}
}
void trave(node *root,int num)
{
	queue<node*> q;
	while(!q.empty())q.pop();
	if(root==NULL)return ;
	q.push(root);
	while(!q.empty())
	{
	   node *t = q.front();
	   q.pop(); 
	   printf("%d ",t->n);
	   if(t->lc)q.push(t->lc);
	   if(t->rc)q.push(t->rc);
	}
	printf("\n");
} 
int main()
{
	node * root=NULL; 
	int num=0;
	build_tree(root,num);
	trave(root,num);
	dele(root,17);
	trave(root,num);
	return 0;	
} 
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年12月17日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档