#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
二叉排序树
最新推荐文章于 2022-09-06 19:08:09 发布