Ⅰ. BinerySearchTree的接口
函数名称 | 功能介绍 |
---|
insert(val) | 插入一个val的值 |
erase(val) | 删除值为val的节点 |
find(val) | 查找一个值,并返回该位置节点的指针 |
Ⅱ.BinerySearchTree的应用
void application1()
{
BSTree<string, string> t;
t.insert({ "left", "左边" });
t.insert({ "right", "右边" });
t.insert({ "child", "孩子" });
t.insert({ "parent", "父亲" });
string tmp;
while (cin >> tmp)
{
auto look = t.find(tmp);
if (look)
{
cout << look->_kv.second << endl;
}
else
{
cout << "无" << endl;
}
}
}
void application2()
{
BSTree<string, int> t;
vector<string> fruit = { "草莓","香蕉","苹果","草莓","苹果", "苹果", "香蕉","香蕉","草莓","香蕉", "草莓", "草莓", "草莓" };
for (auto& s: fruit)
{
auto look = t.find(s);
if (look)
{
look->_kv.second++;
}
else
{
t.insert({ s,1 });
}
}
t.inorder();
}
Ⅲ. BinerySearchTree的底层原理
template<class K,class V>
struct BSTreeNode
{
BSTreeNode<K, V>* _left;
BSTreeNode<K, V>* _right;
pair<K, V> _kv;
BSTreeNode(const pair<K, V>& kv)
:_left(nullptr),_right(nullptr),_kv(kv)
{}
};
template<class K,class V>
class BSTree
{
typedef BSTreeNode<K, V> Node;
public:
bool insert(const pair<K, V>& kv)
{
if (_root == nullptr)
{
_root = new Node(kv);
return true;
}
Node* parent = nullptr;
Node* cur = _root;
while (cur)
{
if (kv.first < cur->_kv.first)
{
parent = cur;
cur = cur->_left;
}
else if(kv.first > cur->_kv.first)
{
parent = cur;
cur = cur->_right;
}
else
{
return false;
}
}
cur = new Node(kv);
if (kv.first < parent->_kv.first)
parent->_left = cur;
else
parent->_right = cur;
return true;
}
bool erase(const K& k)
{
Node* parent = nullptr;
Node* cur = _root;
while (cur)
{
if (k < cur->_kv.first)
{
parent = cur;
cur = cur->_left;
}
else if (k > cur->_kv.first)
{
parent = cur;
cur = cur->_right;
}
else
{
if (cur->_left == nullptr)
{
if (cur == _root)
{
_root = cur->_right;
}
else
{
if (cur == parent->_left)
parent->_left = cur->_right;
else
parent->_right = cur->_right;
}
}
else if (cur->_right == nullptr)
{
if (cur == _root)
{
_root = cur->_left;
}
else
{
if (cur == parent->_left)
parent->_left = cur->_left;
else
parent->_right = cur->_left;
}
}
else
{
Node* rightMinParent = cur;
Node* rightMin = cur->_right;
while (rightMin->_left)
{
rightMinParent = rightMin;
rightMin = rightMin->_left;
}
swap(rightMin->_kv, cur->_kv);
if (rightMin == rightMinParent->_left)
rightMinParent->_left = rightMin->_right;
else
rightMinParent->_right = rightMin->_left;
}
delete cur;
return true;
}
}
return false;
}
Node* find(const K& k)
{
Node* cur = _root;
while (cur)
{
if (k < cur->_kv.first)
{
cur = cur->_left;
}
else if (k > cur->_kv.first)
{
cur = cur->_right;
}
else
{
return cur;
}
}
return nullptr;
}
void inorder()
{
_inorder(_root);
}
private:
void _inorder(Node* root)
{
if (root == nullptr) return;
_inorder(root->_left);
cout << root->_kv.first << " -> " << root->_kv.second << endl;
_inorder(root->_right);
}
private:
Node* _root = nullptr;
};