经测试,现在无bug,欢迎指点。
//main.cpp /////////////////////////////////////////////////// //题目描述:删除给定二叉排序树的给定节点 // //作者:k_eckel(韦福如) //时间:2005-09-30 ////////////////////////////////////////////////// #include <iostream> using namespace std; template <class T> struct node { node<T>* _lchild; node<T>* _rchild; T _key; node(const T& key):_lchild(NULL),_rchild(NULL),_key(key) { } }; template <class T> void Insert(node<T>*& root,const T& key) { if (NULL == root) { node<T>* n = new node<T>(key); root = n; return ; } if (root->_key > key) Insert(root->_lchild,key); else Insert(root->_rchild,key); } template <class T> void Delete(node<T>*& root,const T& key) { if(root == NULL) return; node<T> *ptr = root, *pre = NULL; while(ptr != NULL && ptr->_key != key) { pre = ptr; if(ptr->_key > key) ptr = ptr->_lchild; else ptr = ptr->_rchild; } if(ptr == NULL) return; if(ptr->_lchild == NULL && ptr->_rchild == NULL) { if(ptr == root) { root = NULL; delete ptr; return; } else { if(ptr == pre->_lchild) pre->_lchild = NULL; else pre->_rchild = NULL; delete ptr; } } else if(ptr->_rchild == NULL) { if(ptr == root) root = ptr->_lchild; else if(pre->_lchild == ptr) pre->_lchild = ptr->_lchild; else pre->_rchild = ptr->_lchild; delete ptr; } else if(ptr->_lchild == NULL) { if(ptr == root) root = ptr->_rchild; else if(pre->_lchild == ptr) pre->_lchild = ptr->_rchild; else pre->_rchild = ptr->_rchild; delete ptr; } else { node<T>* tmp = ptr; pre= ptr; ptr = ptr->_rchild; while(ptr->_lchild != NULL) { pre = ptr; ptr = ptr->_lchild; } tmp->_key = ptr->_key; if(ptr->_rchild != NULL) { if(pre->_lchild == ptr) pre->_lchild = ptr->_rchild; else pre->_rchild = ptr->_rchild; } delete ptr; } } template <class T> void InorderPrint(const node<T>* root,const char* info) { if (NULL == root) return ; if (info) cout<<info<<endl; if (NULL != root) { InorderPrint(root->_lchild,NULL); cout<<root->_key<<" "; InorderPrint(root->_rchild,NULL); } } int main(int argc,char* argv[]) { //测试代码 node<int>* r = NULL; //建立一棵用于测试的排序二叉树 Insert<int>(r,5); Insert(r,2); Insert(r,1); Insert(r,3); Insert(r,4); Insert(r,7); Insert(r,6); Insert(r,8); Insert(r,9); InorderPrint<int>(r,"before delete"); cout<<endl; Delete<int>(r,25); //删除不存在的节点 InorderPrint<int>(r,"after delete"); cout<<endl; //Delete<int>(r,5); //有左右子树,根节点 //Delete<int>(r,7); //有左右子树,非根节点 //Delete<int>(r,1); //无左右节点 //Delete<int>(r,8); //有右子树,无左子树 //Delete<int>(r,8); //有右子树,无左子树 Delete<int>(r,3); Delete<int>(r,4); Delete<int>(r,1); //此时有左子树,无右子树 InorderPrint<int>(r,"after delete"); cout<<endl; Delete<int>(r,7); InorderPrint<int>(r,"after delete"); cout<<endl; Delete<int>(r,9); Delete<int>(r,8); Delete<int>(r,2); InorderPrint<int>(r,"after delete"); cout<<endl; Delete<int>(r,5); InorderPrint<int>(r,"after delete"); cout<<endl; Delete<int>(r,6); //此时只有根节点,无左右子树 InorderPrint<int>(r,"after delete"); cout<<endl; system("pause"); return 0; }