先看效果
从 a 到 g 逐个插入红黑树;
删除最小值:
删除最大值:
实现方法是用中序+层序遍历生成.md文件,在markdown软件中打开预览。
源代码,如果你实现过红黑树,可以参考代码细节。
如果没有现成的实现,可以参考:红黑树
template <typename K, typename V>
void ST::RBTree<K, V>::dispMD(const std::string &file) //适用于打印key为string的红黑树结构
{
if (root)
{
std::ofstream fileMD(file, std::ofstream::app);
fileMD << "```mermaid"
<< "\n"
<< "graph TD"
<< "\n";
std::vector<std::string> keysVec = keyVec(); //构造中序遍历结果的字符串
for (auto &&i : keysVec)
{
fileMD << i << "((" << i << "));"
<< "\n";
}
std::queue<RBNode<K, V> *> rbq; //用于层序遍历的队列
rbq.push(root); //将root送入队列
while (!rbq.empty())
{
std::vector<RBNode<K, V> *> cache; //构造层缓存
while (!rbq.empty()) //将队列中的节点存进缓存
{
cache.push_back(rbq.front());
rbq.pop();
}
for (auto &&p : cache)
{
if (p)
{
if (p->left)
{
if (p->left->color)
{
fileMD << p->key << " === " << p->left->key << ";"
<< "\n"
<< "style " << p->left->key << " fill:#f00;"
<< "\n";
}
else
{
fileMD << p->key << " --- " << p->left->key << ";"
<< "\n";
}
rbq.push(p->left);
}
else
{
fileMD << p->key << " -.- " << p->key << "L(( ));"
<< "\n";
}
if (p->right)
{
if (p->right->color)
{
fileMD << p->key << " === " << p->right->key << ";"
<< "\n"
<< "style " << p->right->key << " fill:#f00;"
<< "\n";
}
else
{
fileMD << p->key << " --- " << p->right->key << ";"
<< "\n";
}
rbq.push(p->right);
}
else
{
fileMD << p->key << " -.- " << p->key << "R(( ));"
<< "\n";
}
}
}
}
fileMD << "```"
<< "\n";
fileMD.close();
}
}