二分搜索树
一、二分搜索树的查找
二、二分搜索树的遍历(深度遍历<前、中、后>,广度遍历)
#include <iostream>
#include <queue>
#include <ctime>
#include <cstdlib>
using namespace std;
template <typename Key, typename Value>
class BST {
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* root;
int count;
Node* insert(Node* node, Key key, Value value) {
if (node == NULL) {
count++;
return new Node(key, value);
}
if (key == node->key)
node->value = value;
else if (key < node->key)
node->left = insert(node->left, key, value);
else
node->right = insert(node->right, key, value);
return node;
}
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);
}
Value* search(Node* node, Key key) {
if (node == NULL) return NULL;
if (key == node->key)
return &(node->value);
else if (key < node->key)
return search(node->left, key);
else
return search(node - right, key);
}
//前序遍历
void preoder(Node* node) {
if (node != NULL) {
cout << node->key << endl;
preoder(node->left);
preoder(node->right);
}
}
//中序遍历
void inoder(Node* node) {
if (node != NULL) {
inoder(node->left);
cout << node->key << endl;
inoder(node -> right);
}
}
//后序遍历
void postoder(Node* node) {
if (node != NULL) {
postoder(node->left);
postoder(node->right);
cout << node->key << endl;
}
}
//释放空间
void destory(Node* node) {
if (node != NULL) {
destory(node->left);
destory(node->right);
delete node;
count--;
}
}
public:
BST() {
root = NULL;
count = 0;
}
~BST() { destory(root); }
int size() { return count; }
int isEmpty() { return count == 0; }
int insert(Key key, Value value) { root = insert(root, key, value); }
bool contain(Key key) { return contain(root, key); }
Value* search(Key key) { return search(root, key); }
void preoder() { preoder(root); }
void inoder() { inoder(root); }
void postoder() { postoder(root); }
// 层序遍历
void leveloder(){
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);
}
}
};
int main() {
srand(time(NULL));
BST<int, int> bst = BST<int, int>();
int N = 10, M = 100;
for (int i = 0; i < N; i++) {
int key = rand() % M;
int value = key;
cout << key << " ";
bst.insert(key, value);
}
cout << endl;
cout << "szie:" << bst.size() << endl;
cout << "preoder:" << endl;
bst.preoder();
cout << endl;
cout << "inoder:" << endl;
bst.inoder();
cout << endl;
cout << "postoder:" << endl;
bst.postoder();
cout << endl;
cout << "leveloder:" << endl;
bst.leveloder();
cout << endl;
return 0;
}
三、二分搜索树删除最大值最小值
四、
五、

浙公网安备 33010602011771号