二分搜索树常见操作(C++版)
来源:互联网 发布:小林一茶 知乎 编辑:程序博客网 时间:2024/06/10 01:49
#include <iostream>#include <algorithm>#include <string>#include <ctime>#include <cmath>#include <cassert>#include <queue>using namespace std;template <typename Key,typename Value>class BST{public: BST(){ root=NULL; Count=0; } ~BST(){ destory(root); } int size(){ return Count; } bool isEmpty(){ return Count=0; } void Insert(Key key,Value value){ root=Insert(root,key,value); } Value* Search(Key key){ return Search(root,key); } //前序遍历 void preOrder(){ preOrder(root); } //中序遍历 void inOrder(){ inOrder(root); } //后序遍历 void postOrder(){ postOrder(root); } //层序遍历 void levelOrder(){ queue<Node *>q; q.push(root); while(!q.empty()){ Node *node=q.front(); q.pop(); cout<<node->key<<endl; if(node->left) q.push(node->left); if(node->right) q.push(node->right); } } //寻找最小的键值 Key minimum(){ assert(Count!=0); Node* minNode=minimum(root); return minNode->key; } //寻找最大的键值 Key maximum(){ assert(Count!=0); Node* maxNode=maximum(root); return maxNode->key; } //从二叉树中删除最小值所在的节点 void removeMin(){ if(root) root=removeMin(root); } //从二叉树中删除最大值所在的节点 void removeMax(){ if(root) root=removeMax(root); } //从二叉树中删除键值为key的节点 void Remove(Key key){ root=Remove(root,key); }private: //向以node为根的二分搜索树中,插入节点(key,value) //返回插入新节点后的二分搜索树的根 Node* Insert(Node *node,Key key,Value value){ if(node==NULL){ Count++; return new Node(key,value); } if(key==node->key) node->key=key; else if(key<node->key) node->left=Insert(node->left,key,value); else node->right=Insert(node->right,key,value); return node; } //查找以node为根的二分搜索树中是否包含键值为key的节点 bool contain(Node *node,Key key){ if(node==NULL) return false; if(key==node->key) return true; else if(key<node->key) return contain(node->left,key); else return contain(node->right,key); } //在以node为根的二分搜索树中查找key所对应的value Value* Search(Node *node,Key key){ if(node==NULL) return NULL; if(key==node->value) return &(node->value); else if(key<node->key) return Search(node->left,key); else return Search(node->right,key); } //对以node为根的二分搜索树进行前序遍历 void preOrder(Node *node){ if(node !=NULL){ cout<<node->key<<endl; preOrder(node->left); preOrder(node->right); } } //对以node为根的二分搜索树进行中序遍历 void inOrder(Node *node){ if(node!=NULL){ inOrder(node->left); cout<<node->key<<endl; inOrder(node->right); } } //对以node为根的二分搜索树进行后序遍历 void postOrder(Node *node){ if(node!=NULL){ postOrder(node->left); postOrder(node->right); cout<<node->key<<endl; } } //用类似后序遍历的方法释放空间 void destory(Node *node){ if(node !=NULL){ destory(node->left); destory(node->right); delete(node); Count--; } } //在以node为根的二分搜索树中,返回最小键值的节点 Node* minimum(Node* node){ if(node->left == NULL) return node; return minimum(node->left); } //在以node为根的二分搜索树中,返回最大键值的节点 Node* maximum(Node *node){ if(node->right==NULL){ return node; } return maximum(node->right); } //删除掉以node为根的二分搜索树中的最小节点 //返回删除节点后新的二分搜索树的根 Node* removeMin(Node *node){ if(node->left==NULL){ Node* rightNode=node->right; delete node; Count--; return rightNode; } node->left=removeMin(node->left); return node; } //删除掉以node为根的二分搜索树中的最大节点 //返回删除节点后新的二分搜索树的根 Node* removeMax(Node* node){ if(node->right==NULL){ Node* leftNode=node->left; delete node; Count--; return leftNode; } node->right=removeMax(node->right); return node; } //删除掉以node为根的二分搜索树中键值为key的节点 //返回删除节点后新的二分搜索树的根O(logn) Node* Remove(Node* node,Key key){ if(node == NULL) return NULL; if(key<node->key){ node->left=Remove(node->left,key); return node; } else if(key>node->key){ node->right=Remove(node->right,key); return node; } else{//key==node->key if(node->left==NULL){ Node *rightNode=node->right; delete node; Count--; return rightNode; } if(node->right==NULL){ Node *leftNode=node->left; delete node; Count--; return leftNode; } //node->left!=NULL && node->right!=NULL; Node *successor=new Node(minimum(node->right)); Count++; successor->right=removeMin(node->right); successor->left=node->left; delete node; Count--; return successor; } }private: struct Node{ Key key; Value value; Node *left; Node *right; Node(Key key,Value value){ this->key=key; this->value=value; this->left=this->right=NULL; } Node(Node *node){ this->key=node->key; this->value=node->value; this->left=node->left; this->right=node->right; } }; Node *root;//根节点 int Count;//记录节点数};
2 0
- 二分搜索树常见操作(C++版)
- 二分搜索树的删除节点操作
- 二分搜索代码(c++)
- 【常见面试算法题】之二分搜索
- 二分搜索||c语言实现
- 算法之二分搜索树C语言实现
- 最优二分搜索树
- 最优二分搜索树
- 二分搜索树
- 二分搜索树
- 二分搜索树--完整版
- 二分搜索树
- 二分搜索树(一)
- 二分搜索树(二)
- BST二分搜索树
- 二分搜索树
- C语言二叉搜索树基本操作
- C常见文件操作
- 《高性能mysql》之高性能索引创建(第五章)
- GFS论文中文翻译
- python生成器学习心得
- Mysql 日期,时间函数
- Struts2内置拦截器timer的使用
- 二分搜索树常见操作(C++版)
- openssl RSA DSA 加密算法使用
- 截取手机号,截取名字
- 剑指Offer面试题26复杂链表的复制,面试题27二叉搜索树和双向链表(递归)
- AVR单片机软件按钮消抖与确认
- mysql中各种类型变量的定义以及赋值使用
- Android中WebView使用
- 【程序48】 题目:某个公司采用公用电话传递数据,数据是四位的整数, 在传递过程中是加密的,加密规则如下:每位数字都加上5, 然后用和除以10的余数代替该数字,再将第一位和第四位交换, 第二位
- LeetCode :【Easy】344. Reverse String