源码系列:二叉排序树
来源:互联网 发布:淘宝卖家正在被处罚 编辑:程序博客网 时间:2024/05/29 17:05
binary_search_tree.cpp
#include <iostream>#include <vector>#include <algorithm>#include <iterator>using namespace std;namespace algo{ template<typename T> class BinarySearchTree { private: struct _Node { T value; _Node *left; _Node *right; }; public: BinarySearchTree() : _root(NULL){} ~BinarySearchTree() { _RecursiveReleaseNode(_root); } bool Create(vector<T> &vec) { for(vector<T>::iterator iter = vec.begin();iter != vec.end();iter++) { if(!Insert(*iter)) { return false; } } return true; } bool Insert(T data) { _Node *node = new _Node(); if(node == NULL) { cout << "空间不足!分配失败!\n" << endl; return false; } node->value = data; node->left = NULL; node->right = NULL; _Node *current_node = _root; _Node *parent_node = current_node; int flag = 0; if(current_node == NULL) { _root = node; } else { while(current_node) { if(data < current_node->value) { parent_node = current_node; current_node = current_node->left; flag = 0; } else { parent_node = current_node; current_node = current_node->right; flag = 1; } } if(flag == 0) { parent_node->left = node; } else { parent_node->right = node; } } return true; } bool Search(T data) { if(!_root) { return false; } _Node *current_node = _root; while(current_node) { if(data == current_node->value) { cout << "找到" << data << endl; break; }else if(data < current_node->value) { current_node = current_node->left; }else { current_node = current_node->right; } } if(current_node == NULL) return false; return true; } bool Delete(T data) { return _Delete(_root,data); } void Display() { _Display(_root); } private: bool _Delete(_Node *&node,T data) { if(!_root) return false; if(data == node->value) { if(node->left == NULL && node->right == NULL) { delete node; node = NULL; } else if(node->left != NULL && node->right == NULL) { _Node *temp = node->left; delete node; node = temp; } else if(node->left == NULL && node->right != NULL) { _Node *temp = node->right; delete node; node = temp; } else { _Node *current_node = node->left; _Node *parent_node = NULL; while(current_node->right != NULL) { parent_node = current_node; current_node = current_node->right; } node->value = current_node->value; if(parent_node) { parent_node->right = current_node->left; } else { node->left = current_node->left; } delete current_node; } return true; } else if(data < node->value) return _Delete(node->left,data); else return _Delete(node->right,data); } void _Display(_Node *node) { if(node) { _Display(node->left); cout << node->value << "\t"; _Display(node->right); } } void _RecursiveReleaseNode(_Node* node) { if(node) { _RecursiveReleaseNode(node->left); _RecursiveReleaseNode(node->right); delete node; } } _Node *_root; };}测试程序:
#include <iostream>#include "binary_search_tree.cpp"using namespace std;int main(){ algo::BinarySearchTree<int> bst; int data[8] = {13,15,6,20,14,5,7,18}; vector<int> vec(data,data+sizeof(data)/sizeof(int)); bst.Create(vec); bst.Display(); cout << endl; bst.Delete(20); bst.Display(); cout << endl; bst.Delete(15); bst.Display(); cout << endl; bst.Delete(13); bst.Display(); return 0;}测试所用BST:
测试结果:
0 0
- 源码系列:二叉排序树
- 二叉排序树--源码
- 查找系列之二叉排序树
- 二叉排序树的源码
- 数据结构与算法系列----二叉排序树
- 二叉排序树(AVL树)源码
- 二叉排序树C实现(含完整源码)
- 二叉排序树C实现(含完整源码)
- 二叉排序树C实现(含完整源码)
- 二叉排序树
- 二叉排序树
- 二叉排序树
- 二叉排序树
- 二叉排序树
- 二叉排序树
- 二叉排序树
- 二叉排序树
- 二叉排序树
- 编程输出100~200之间的素数
- 常见的浏览器兼容问题的处理
- 《一步之遥》之观后感
- csu 1346: 变色龙
- 【vs】*pdb时出错;请检查是否是磁盘空间不足、路径无效或权限不够
- 源码系列:二叉排序树
- hdu 5147 (树状数组的应用)
- 秀丸 行内容批量修改
- C++学习之类
- HDU 5147 Sequence II
- 在MyEclipse中,学习xml,配置aop的方法:如下:
- 组合数学
- 巧用视图
- OpenStack 最小化安装配置(五):KeyStone服务配置