2022-02-24 Mermaid画红黑树(C++自动输出MD文件)

先看效果

从 a 到 g 逐个插入红黑树;

a
a
b
a
b
c
a
b
c
d
a
b
c
d
e
a
b
c
d
e
f
a
b
c
d
e
f
g

删除最小值:

b
c
d
e
f
g

删除最大值:

b
c
d
e
f

实现方法是用中序+层序遍历生成.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();
        }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不停感叹的老林_<C 语言编程核心突破>

不打赏的人, 看完也学不会.

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值