二叉排序树

#include<iostream>
using namespace std;

typedef int Status;

template<class T>
class BiTNode
{
public:
	template<class T> friend class BSTree;
private:
	T key;
	BiTNode *lchild,*rchild;
};

template<class T>
class BSTree
{
public:
	Status Insert_BST(BiTNode<T> *&BT,T key);//插入BT中不存在的关键字key
	Status Search_BST(BiTNode<T> *&BT,T key,BiTNode<T> *BF,BiTNode<T> *&p);//查找操作
	Status Delete_BST(BiTNode<T> *&BT,T key);//删除元素
	void Delete(BiTNode<T> *&p);//删除操作
	void Output(BiTNode<T> *&BT);
	void visit(T key);
};

template<class T>
Status BSTree<T>::Search_BST(BiTNode<T> *&BT,T key,BiTNode<T> *BF,BiTNode<T> *&p)
{//在根指针BT所指二叉树中递归的查找其关键字等于key的数据元素
 //若查找成功,则p指向该数据元素结点,并返回true,否则p指向访问路径上最后一个结点并返回false
 //指针BF指向BT的双亲,其初值为NULL
	if(!BT)					//查找不成功
		{p=BF;return false;}
	else if(key==BT->key)		//查找成功
		{p=BT;return true;}//elseif
	else if(key<BT->key)		//在左子树中继续查找
		{Search_BST(BT->lchild,key,BT,p);}//elseif
	else
		Search_BST(BT->rchild,key,BT,p);	//在右子树中继续查找
}//Search_BST

template<class T>
Status BSTree<T>::Insert_BST(BiTNode<T> *&BT,T key)
{//当二叉排序树T中不存在关键字等于BT.key时,插入key并返回true,否则返回false
	BiTNode<T> *p=NULL,*s=NULL;
	if(!Search_BST(BT,key,NULL,p))	//查找不成功
	{
		s=new BiTNode<T>;
		s->key=key;s->lchild=NULL;s->rchild=NULL;
		if(!p)	//BT为空树
			BT=s;	//被插结点成为根结点
		else if(key<p->key)
			{p->lchild=s;}	//成为左孩子
		else 
			p->rchild=s;	//成为右孩子
		return true;
	}//if
	else
		return false;		//树中已存在关键字相同的结点,不再插入	
}//Insert_BST

template<class T>
void BSTree<T>::Output(BiTNode<T> *&BT)
{
	if(BT)  
    {  
        Output(BT->lchild);      //中序遍历左子树  
        visit(BT->key);  		//访问根结点  
        Output(BT->rchild);      //中序遍历右子树  
    }//if
}//Output

template<class T>
void  BSTree<T>::visit(T key)
{
	cout<<key<<" ";
}//visit

template<class T>
Status BSTree<T>::Delete_BST(BiTNode<T> *&BT,T key)
{
	if(!BT)
		return false;
	else
	{
		if(key==BT->key)
			Delete(BT);
		else if(key<BT->key)
			Delete_BST(BT->lchild,key);
		else
			Delete_BST(BT->rchild,key);
		return true;
	}//else
}//Delete_BST

template<class T>
void BSTree<T>::Delete(BiTNode<T> *&p)
{//从二叉排序树中删除结点p,并重新接受它的左或右子树
	BiTNode<T> *q=NULL,*s=NULL;
	if((!p->lchild)&&(!p->rchild))//为叶子结点
		{delete p; p=NULL;}
	else if(!(p->lchild))//左子树为空,只需接受其右子树,即用其右子树替换该结点
		{q=p; p=p->rchild; delete q; q=NULL;}//elseif
	else if(!p->rchild)//右子树为空,只需接受其左子树,即用左子树替换该结点
		{q=p; p=p->lchild; delete q; q=NULL;}//else if
	else//左右子树均不空
	{
		q=p; s=p->lchild;
		while(s->rchild)//左转,然后向右走到尽头
		{
			q=s;
			s=s->rchild;
		}//while
		p->key=s->key;//此时s为p的直接前驱,采用方式二,用s替代p,然后将s的右子树的双亲改为s的双亲即可
		if(q!=p)//表明s不是结点p的左孩子
			q->rchild=s->lchild;//重接q的右子树
		else
			q->lchild=s->lchild;//重接q的左子树
	}//else
}//Delete


void main()
{
	BSTree<int> BST;
	BiTNode<int> *BT=NULL;
	int key;
	while(cin>>key)
	{
		BST.Insert_BST(BT,key);	
	}//while
	BST.Output(BT);
	cout<<endl;
	BST.Delete_BST(BT,45);
	BST.Output(BT);
}//main

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值