二叉排序树

来源:互联网 发布:ubuntu界面太小 编辑:程序博客网 时间:2024/04/30 23:36
#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中不存在的关键字keyStatus 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的双亲,其初值为NULLif(!BT)//查找不成功{p=BF;return false;}else if(key==BT->key)//查找成功{p=BT;return true;}//elseifelse if(key<BT->key)//在左子树中继续查找{Search_BST(BT->lchild,key,BT,p);}//elseifelseSearch_BST(BT->rchild,key,BT,p);//在右子树中继续查找}//Search_BSTtemplate<class T>Status BSTree<T>::Insert_BST(BiTNode<T> *&BT,T key){//当二叉排序树T中不存在关键字等于BT.key时,插入key并返回true,否则返回falseBiTNode<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;}//ifelsereturn false;//树中已存在关键字相同的结点,不再插入}//Insert_BSTtemplate<class T>void BSTree<T>::Output(BiTNode<T> *&BT){if(BT)      {          Output(BT->lchild);      //中序遍历左子树          visit(BT->key);  //访问根结点          Output(BT->rchild);      //中序遍历右子树      }//if}//Outputtemplate<class T>void  BSTree<T>::visit(T key){cout<<key<<" ";}//visittemplate<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);elseDelete_BST(BT->rchild,key);return true;}//else}//Delete_BSTtemplate<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;}//elseifelse if(!p->rchild)//右子树为空,只需接受其左子树,即用左子树替换该结点{q=p; p=p->lchild; delete q; q=NULL;}//else ifelse//左右子树均不空{q=p; s=p->lchild;while(s->rchild)//左转,然后向右走到尽头{q=s;s=s->rchild;}//whilep->key=s->key;//此时s为p的直接前驱,采用方式二,用s替代p,然后将s的右子树的双亲改为s的双亲即可if(q!=p)//表明s不是结点p的左孩子q->rchild=s->lchild;//重接q的右子树elseq->lchild=s->lchild;//重接q的左子树}//else}//Deletevoid main(){BSTree<int> BST;BiTNode<int> *BT=NULL;int key;while(cin>>key){BST.Insert_BST(BT,key);}//whileBST.Output(BT);cout<<endl;BST.Delete_BST(BT,45);BST.Output(BT);}//main

0 0
原创粉丝点击