#include<iostream>
using namespace std;
template<class K, class V>
struct BSTreeNode
{
K _key;
V _value;
BSTreeNode* left;
BSTreeNode* right;
BSTreeNode(K k, V v)
{
_key = k;
_value = v;
left = right = nullptr;
}
};
template<class K, class V>
class BSTree
{
typedef BSTreeNode<K, V> Node;
public:
bool Insert(const K& key, const V& value)
{
if (_root == nullptr)
_root = new Node(key, value);
else
{
Node* r = _root;
Node* parent = _root;
while (r)
{
parent = r;
if (r->_key > key)
r = r->left;
else if (r->_key < key)
r = r->right;
else
return false;
}
if (parent->_key > key)
parent->left = new Node(key, value);
else
parent->right = new Node(key, value);
return 1;
}
}
Node* Find(const K& key)
{
Node* newr = _root;
while (newr && newr->_key != key)
{
if (newr->_key > key)
newr = newr->left;
else
newr = newr->right;
}
return newr;
}
bool Erase(const K& key)
{
Node* newr = _root;
Node* parent = _root;
while (newr && newr->_key != key)
{
parent = newr;
if (newr->_key > key)
newr = newr->left;
else
newr = newr->right;
}
if (newr == nullptr)
return 0;
//存在孩子为空
if (newr->left==nullptr || newr->right==nullptr)
{
if (newr == parent)
{
if (newr->left)
_root = newr->left;
else
_root=_root->right;
}
else if (newr->left == nullptr)
{
if (parent->left == newr)
parent->left = newr->right;
else
parent->right = newr->right;
}
else
{
if (parent->left == newr)
parent->left = newr->left;
else
parent->right = newr->left;
}
free(newr);
}
else
{
Node* r = newr->left;
Node* parent2 = newr->left;
while (r->left)
{
parent2 = r;
r = r->left;
}
newr->_key = r->_key;
newr->_value = r->_value;
parent2->left = nullptr;
free(r);
}
return 1;
}
void InOrder()
{
inorder(_root);
}
void inorder(Node* root)
{
if (root == nullptr)
return;
inorder(root->left);
cout << root->_key<<' ';
inorder(root->right);
}
private:
Node* _root = nullptr;
};
二叉搜索树模拟实现
最新推荐文章于 2024-07-25 17:57:45 发布