数据结构与算法学习库——DSA

[数据结构与算法] 专栏收录该内容
8 篇文章 1 订阅

介绍

不少在校学生在学习数据结构与算法时痛苦不堪,很多数据结构写起来验证也很困难。如果有一个库,能帮助大家解决构建数据结构的困难,以快速验证自己的想法,那多好啊。

DSA(Data struct & Algorithm) 就是这样的一个工具。

示例 1

我们来看一个示例。

#include <iostream>
#include <string_view>
#include "binary_tree.h"

using namespace dsa;
using Tree = BinaryTree<int>;

int main() {
    constexpr std::string_view tree_graph = R"(
                  1        <- right_rotate
                /   \
               2     3
             /   \
            4     5

                  ||

                  2
                /   \
               4     1
                   /   \
                  5     3
    )";

    // We can build a binary tree from list
    Tree tree({1, 2, 3, 4, 5});
    std::cout << tree << std::endl;

    // Rotate at root
    tree.right_rotate(1);

    // Print the tree
    std::cout << tree << std::endl;
    return 0;
}

只要引入头文件,binary_tree.h,你就能轻松的创建一个二叉树了。创建二叉树非常的简单,只需要提供一个数组就行了。它的构建规则就像 leetcode 中的示例构建规则。如果你要创建一下像下面的二叉树:

constexpr std::string_view tree_graph = R"(
              2
            /   \
           4     1
               /   \
              5     3
)";

只需要调用:

Tree tree({2, 4, 1, {}, {}, 5, 3});

其中 {}, {} 表示用于占位节点 4 的两个空孩子节点,是不是非常简单。整个 list 相当于对二叉树进行层序遍历(空节点也需要遍历)。

当然二叉树非常非常简单,除此之外,你了可以引入 red_black_tree.h,来构建红黑树,一切都是那么的自然。

如果你想验证自己的想法,比如想自己实现二叉树的一些基本操作,只需要继承 BinaryTree 就可以,像下面这样:

class MyBinaryTree : public BinaryTree<int> {
public:
// ...
};

示例 2

下面是红黑树的实现:

template <typename K, typename V>
class RedBlackTree : public BinarySearchTree<K, V> {
public:
// ...
};

使用起来也相当方便。

#include <vector>
#include <optional>
#include <red_black_tree.h>

using namespace dsa;

using Tree = RedBlackTree<int, int>;

int main() {
    Tree tree;

    for (int i = 10; i <= 100; i += 10) {
        tree.insert(i, 2*i);
    }
    for (int i = 5; i <= 95; i += 10) {
        tree.insert(i, 2*i);
    }
    std::cout << tree << std::endl << std::endl;


    for (int i = 5; i <= 100; i += 5) {
        tree.remove(i);
        std::cout << "Remove:" << i << std::endl;
        std::cout << tree << std::endl << std::endl;
    }
    return 0;
}

上面的程序会输出结果:

在这里插入图片描述

项目托管

本项目托管在 https://github.com/ivanallen/dsa

目前还在不断的完善中,欢迎有志之士帮助我们提 Issue,你也可以贡献自己的力量,来丰富这个项目。

联系方式

  • QQ 群:610441700
  • 钉钉群:

在这里插入图片描述

  • 3
    点赞
  • 4
    评论
  • 1
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值