二叉搜索树的Insert、Find、FindMin、FindMax、Delete、MakeEmpty
来源:互联网 发布:伊朗核协议 知乎 编辑:程序博客网 时间:2024/06/07 02:18
searchTree.h 功能实现
/*==============================================二叉查找树(BSTree)的Insert、Find、FindMin、FindMax、Delete、MakeEmpty编译环境:Visual Studio 2012Date: 2015/01/17==============================================*/#include <stdlib.h>#include <string>#include <iostream>using namespace std;typedef int elemType;typedef struct node BSTreeNode;typedef struct node BSTree;struct node{elemType elem;BSTreeNode* left;BSTreeNode* right;};void fatalError(const std::string str){cout << "ERROR: "<< str <<endl;system("pause");exit(-1);}BSTreeNode* makeBSTreeEmpty(BSTree* bstree){if (bstree != NULL){makeBSTreeEmpty(bstree->left);makeBSTreeEmpty(bstree->right);free(bstree);}return bstree;}BSTreeNode* insertBStree(BSTree* bstree, elemType x){if (bstree == NULL){bstree = (BSTree *)malloc(sizeof(*bstree));if(bstree == NULL)fatalError("分配BSTree节点异常");bstree->elem = x;bstree->left = NULL;bstree->right = NULL;}else{if (x < bstree->elem){bstree->left = insertBStree(bstree->left, x);}else if (x > bstree->elem){bstree->right = insertBStree(bstree->right, x);}}return bstree;}BSTreeNode* findElem(BSTree* bstree, elemType x){if(bstree == NULL){cout << "没有找到元素:" << x <<endl;return NULL;}else if (x < bstree->elem){ findElem(bstree->left, x);}else if(x > bstree->elem){ findElem(bstree->right, x);}else{return bstree;}}BSTreeNode* findMinElem(BSTree* bstree){if (bstree == NULL){fatalError("findMinElem:树为空");}else if (bstree->left == NULL){return bstree;}else{findMinElem(bstree->left);}}BSTreeNode* findMaxElem(BSTree* bstree) //递归实现{if (bstree == NULL){fatalError("findMaxElem:树为空");}else if (bstree->right == NULL){return bstree;}else{findMaxElem(bstree->right);}}BSTreeNode* findMaxElem2(BSTree* bstree) //非递归实现{if (bstree == NULL){fatalError("findMaxElem:树为空");}while(bstree->right != NULL){bstree = bstree->right;}return bstree;}BSTreeNode *deleteElem(BSTree* bstree, elemType x){BSTreeNode* tempNode = NULL;//删除节点不能通过findElem()函数查找x 元素地址后实现,因为无法获得x 前一结点的地址(可另写一个函数findPrevElem()实现)if (bstree == NULL){cout << "该BSTree 不含有元素: " << x <<endl;}else if (x < bstree->elem) // x在左子树中,向左递归{bstree->left = deleteElem(bstree->left, x);}else if (x > bstree->elem){bstree->right = deleteElem(bstree->right, x);}else //找到元素x的位置:x == bstree->elem,进行删除{//=== 1或0个child ======tempNode = bstree;if (bstree->left == NULL){bstree = bstree->right;}else if (bstree->right == NULL){bstree = bstree->left;free(tempNode);}//=== 2个child ======else{tempNode = findMinElem(bstree->right); //选右子树的最小值代替被删除节点的元素值(或者:选左子树中的最大值)bstree->elem = tempNode->elem;bstree->right = deleteElem(bstree->right, tempNode->elem); //删除右子树中的最小值(min没有左子树)}//free(tempNode);//free()如果在此处会导致free两次}return bstree;}
searchTree.cpp 测试函数
#include "searchTree.h"int main(){BSTree* T = NULL;elemType a[] = {30,50,20,40,25,70,54,23,80,92};for (int i = 0; i < sizeof(a)/sizeof(a[0]); i++){ T = insertBStree(T, a[i]);}findElem(T, 10);for (int i = 0; i < sizeof(a)/sizeof(a[0]); i++){cout << a[i] << " 0x" << findElem(T, a[i]) << endl; }cout << endl;cout << "Min: addr--0x" << findMinElem(T) <<endl;cout << "1-Max: addr--0x" << findMaxElem(T) <<endl;cout << "2-Max: addr--0x" << findMaxElem2(T) <<endl;deleteElem(T, 10);deleteElem(T, 50);for (int i = 0; i < sizeof(a)/sizeof(a[0]); i++){cout << a[i] << " 0x" << findElem(T, a[i]) << endl; }cout << endl;makeBSTreeEmpty(T);system("pause");return 0;}
参考资料:《数据结构与算法分析——C语言描述》 P73
0 0
- 二叉搜索树的Insert、Find、FindMin、FindMax、Delete、MakeEmpty
- 二叉搜索树的实现(insert、find、remove)
- 二叉搜索树的查询、插入与删除操作(Binary Search Tree, Search, Insert, Delete)(C++)
- 【数据结构】搜索二叉树的(递归与非递归)实现,包括:增Insert,删Remove,查Find
- 二叉树的创建insert
- 【LeetCode450】Delete Node in BST二叉搜索树删除节点
- 501. Find Mode in Binary Search Tree | 二叉搜索树重复的节点
- leetcode 501. Find Mode in Binary Search Tree 二叉搜索树BST的中序遍历
- insert、update、delete的用法
- 二叉搜索树的插入,搜索,删除
- 二叉搜索树的实现
- 二叉搜索树的建立
- 搜索二叉树的初始化
- 二叉搜索树的插入
- 搜索二叉树的应用
- 二叉搜索树的实现
- 二叉搜索树的实现
- 二叉搜索树的实现
- Roman to Integer
- jvm压缩指针
- rhel7安装wine时需要32位库
- Android的Handler总结
- strupr与strlwr函数的实现
- 二叉搜索树的Insert、Find、FindMin、FindMax、Delete、MakeEmpty
- anroid 找控件 监听 发消息
- 系统的入口:web.xml
- Java web----文件上传
- GDB调试程序
- Linux下802.1连接问题解决方案
- iphone图片拉伸的几种方法
- 企业数据安全规划面临哪些问题?
- 关于单例模式