#include<iostream>
#include<string>
using namespace std;
template<class K, class V>
class BSTreeNode
{
public:
BSTreeNode<K,V>* left;
BSTreeNode<K,V>* right;
K k;
V v;
BSTreeNode(const K& _k, const V& _v)
:left(nullptr), right(nullptr), k(_k), v(_v)
{
}
};
template<class K, class V>
class BSTree
{
typedef BSTreeNode<K, V> Node;
public:
bool Insert(const K& key, const V& value)
{
Node* cur = _root;
Node* pare = nullptr;
while (cur)
{
if (key < cur->k)
{
pare = cur;
cur = cur->right;
}
else if (key > cur->k)
{
pare = cur;
cur = cur->left;
}
else if (key == cur->k) return false;
}
Node* newnode = Node(key, value);
if (key < pare->k) newnode = pare->right;
else if (key > pare->k) newnode = pare->left;
return true;
}
Node* Find(const K& key)
{
Node* cur = _root;
while (cur)
{
if (key < cur->k)
{
cur = cur->right;
}
else if (key > cur->k)
{
cur = cur->left;
}
else if (key == cur->k)
return cur;
}
return nullptr;
}
bool Erase(const K& key)
{
Node* pare = nullptr;
Node* cur = _root;
while (cur)
{
if (cur->k < key)
{
pare = cur;
cur = cur ->right
}
else if (cur->k > key)
{
pare = cur;
cur = cur->left;
}
else
{
if (cur->left == nullptr)
{
if (cur == _root)
{
_root = cur ->right
}
else
{
if (pare->left == cur)
pare->left = cur->right;
else if (pare->right == cur)
pare->right = cur->right;
}
delete cur;
}
else if (cur->right == nullptr)
{
if (cur == _root)
{
_root = cur->left;
}
else
{
if (pare->left == cur)
pare->left = cur->left;
else if (pare->right == cur)
pare->right = cur->left;
}
delete cur;
}
else
{
Node* minright = cur ->right;
Node* minright_pare = cur;
while (minright->left != nullptr)
{
minright_pare = minright;
minright = minright->left;
}
cur->k = minright->k;
if (minRight == minright_pare->_left)
{
minright_pare->_left = minRight->_right;
}
else
{
minright_pare->_right = minRight->_right;
}
delete minRight;
}
return true;
}
}
return false;
}
void _InOrder(Node* root)
{
if (root == nullptr)
return;
_InOrder(root->right);
cout << root->k << ":" << root->v;
_InOrder(root->left);
}
void InOrder()
{
_InOrder(_root);
}
private:
Node* _root = nullptr;
};
二叉搜索树
最新推荐文章于 2025-05-13 07:45:34 发布