二叉搜索树删除节点完美版
来源:互联网 发布:淘宝联盟优惠券推广 编辑:程序博客网 时间: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;}
- 二叉搜索树删除节点完美版
- 二叉搜索树删除节点
- 二叉搜索树---AVL树删除节点
- 二叉搜索树——删除节点
- 二叉搜索树节点删除 java实现
- 二叉搜索树非递归方式删除节点
- Java实现二叉搜索树节点的删除
- 【LeetCode450】Delete Node in BST二叉搜索树删除节点
- 二叉树删除节点
- 二叉树删除节点
- 二叉树删除节点
- 排序二叉树常规操作(搜索,插入,删除,最大节点,最小节点)
- 二叉搜索树建立、插入、删除、前继节点、后继节点之c++实现
- 二叉搜索树 插入节点
- 删除二叉树的节点
- 二叉查找树删除节点
- 二叉树中节点删除
- 二叉树节点的删除
- 时间的九大杀手
- java application 应用程序 使用JDBC proxool 两种方式连接数据库 测试程序代码
- 词法分析太松,语法分析太紧。
- 错误“AxImp.exe”已退出,代码为 -1163019603。
- 技术大牛的练成
- 二叉搜索树删除节点完美版
- VS2008下安装CGAL-3.7
- test
- NSURLRequestCachePolicy缓存配置说明
- 构造器Constructor
- Android之ListView和GridView
- 【离散化\并查集\搜索】cake
- MTK6577手机有哪些 MT6577手机汇总
- 由-128的补码引出的思考