二叉查找树实现-双向链表
2015-07-02 15:48
477 查看
////二叉查找树,为了实现方便,给每个节点添加了一个指向父节点的指针 #include<iostream> #include<vector> #include<ctime> #include<cstdlib> using namespace std; template<class T> class BinarySearchTree { private: struct Node { T data; int deep; Node *left; Node *right; Node *prev; Node(T val,int deep) { data = val; deep = 0; left = NULL; right = NULL; prev = NULL; } private: Node() { } }; Node *root; int size; public: BinarySearchTree() { root = NULL; size = 0; } ~BinarySearchTree() { clear(root); root = NULL; size = 0; } T min(Node *node) const { if(node->left == NULL) return node->data; else return min(node->left); } T max(Node *node) const { if(node->right == NULL) return node->data; else return max(node->right); } Node *insert(Node *& node,T val) { if(size == 0 && node == NULL) { root = new Node(val,0); root->prev = NULL; size++; return root; } if(size != 0 && node == NULL) { cout<<"ERROR\n"; return NULL; } if(val > node->data) { if(node->right != NULL) return insert(node->right,val); else { Node *tmp = new Node(val,node->deep+1); tmp->prev = node; node->right = tmp; size++; return tmp; } } else if(val < node->data) { if(node->left != NULL) return insert(node->left,val); else { Node *tmp = new Node(val,node->deep+1); tmp->prev = node; node->left = tmp; size ++; return tmp; } } else if(val == node->data) { } } bool contain(Node *node,T val) const { if(node == NULL) return false; if(val > node->data) return contain(node->right,val); else if(val < node->data) return contain(node->left,val); else return true; } void removeNode(Node *node) { if(node->left == NULL && node->right == NULL) { if(node->prev->left == node) node->prev->left = NULL; else node->prev->right = NULL; delete node; size--; } else if(node->left == NULL) { node->right->prev = node->prev; if(node->prev->left == node) node->prev->left = node->right; else node->prev->right = node->right; decDeep(node->right); delete node; size--; } else if(node->right == NULL) { node->left->prev = node->prev; if(node->prev->left == node) node->prev->left = node->left; else node->prev->right = node->left; decDeep(node->left); delete node; size--; } else { Node *p = node->right; while(p->left != NULL) { p=p->left; } node->data = p->data; if(p->right != NULL) { p->prev->left = p->right; p->right->prev = p->prev; decDeep(p->right); delete p; size--; } else { p->prev->left = NULL; delete p; size--; } } } void decDeep(Node *node) { node->deep--; if(node->left != NULL) decDeep(node->left); if(node->right != NULL) decDeep(node->right); } void remove(T val) { Node * p=root; while(1) { if(val > p->data) p = p->right; else if(val < p->data) p = p->left; else if(val == p->data) { removeNode(p); return; } } } void clear(Node*node) { if(node->left != NULL) clear(node->left); if(node->right != NULL) clear(node->right); delete node; node = NULL; } void print(Node *node) { if(node == NULL) return; cout<<node->data<< " "; if(node->left != NULL) print(node->left); if(node->right != NULL) print(node->right); } void insert(T val) { insert(root,val); } void print() { print(root); cout<<"\n"; } }; int main() { BinarySearchTree<int> tree; tree.insert(10); tree.insert(1); tree.insert(11); tree.insert(9); tree.insert(8); tree.print(); cout<<"\n\n"; tree.remove(9); tree.print(); return 0; }
相关文章推荐
- getopt函数的使用——分析命令行参数
- IOS 错误:error: unknown type name 'UIImageView'
- crontab使用详解
- 正则表达式 Pattern
- python实现在控制台输入密码不显示的方法
- 如何使用Android Studio把自己的Android library分享到jCenter和Maven Central
- 浅谈如何推翻GRE阅读的固定思维
- c++正则表达式日期格式匹配
- Java学习笔记七(文件夹操作)
- selector资源的两种使用方式
- yum更新源
- 自适应网页设计(Responsive Web Design)
- textview字体的高度
- 回溯算法
- 判断浏览器 插件 jquery.ua.js
- 关于ffmpeg avcodec_open2函数失败的问题
- 本地数据库(SQL Server)远程连接服务器端服务器
- 修正iOS从照相机和相册中获取的图片方向(转)
- 黑马程序员——Java基础:枚举
- CentOS开启和关闭防火墙