首页 > 解决方案 > C++ | 以漂亮的方式将树(不一定是二进制)打印到标准输出

问题描述

假设我有struct这样的:

    struct Node {
        int val = 0;
        std::vector<Node *> _children{};
    };

我怎样才能stdout以整洁漂亮的方式打印它?例如像tree程序打印出目录结构的方式。

parent/
├── child1
│   ├── cchild1
│   ├── cchild2
│   ├── child3
│   │   └── child1
│   └── child4
│       ├── child1
│       └── child2
└── child2
    └── cchild1
        └── ccchild1

它不必完全按照上面的格式,因为我在这里并没有什么偏好。

这个问题与此不同,因为我想漂亮地打印一棵有多个孩子的树。

标签: c++algorithmtree

解决方案


通过修改此答案中的代码,我设法使其适用于具有多个孩子的 Tree

void Node::printSubtree(const std::string &prefix) {
    using std::cout;
    using std::endl;
    if (_children.empty()) return;
    cout << prefix;
    size_t n_children = _children.size();
    cout << (n_children > 1 ? "├── " : "");

    for (size_t i = 0; i < n_children; ++i) {
        Node *c = _children[i];
        if (i < n_children - 1) {
            bool printStrand = n_children > 1 && !c->_children.empty();
            std::string newPrefix = prefix + (printStrand ? "│\t" : "\t");
            std::cout << val << "\n";
            c->printSubtree(newPrefix);
        } else {
            cout << (n_children > 1 ? prefix : "") << "└── ";
            std::cout << val << "\n";
            c->printSubtree(prefix + "\t");
        }
    }
}

void Node::printTree() {
    using std::cout;
    std::cout << val << "\n";
    printSubtree("");
    cout << "\n";
}

但是,欢迎新的解决方案。


推荐阅读