二叉搜索树删除节点完美版

来源:互联网 发布:淘宝联盟优惠券推广 编辑:程序博客网 时间:2024/04/29 04:34

经测试,现在无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); elseInsert(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;elseptr = 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;elsepre->_rchild = NULL;delete ptr;}}else if(ptr->_rchild == NULL){if(ptr == root)root = ptr->_lchild;else if(pre->_lchild == ptr)pre->_lchild = ptr->_lchild;elsepre->_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;elsepre->_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;elsepre->_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;}

原创粉丝点击