Показать сообщение отдельно

Читабельный вывод древообразной структуры на консоль
  #87  
Старый 17.01.2010, 19:41
rudvil
Участник форума
Регистрация: 25.08.2008
Сообщений: 187
Провел на форуме:
2066562

Репутация: 86
По умолчанию Читабельный вывод древообразной структуры на консоль

Функция для вывода читабельной древообразной структуры на консоль.
Писал для дерева такого типа
Код:
class Tree {
public:
    std::string value;
    std::vector<Tree> tree;
};
также легко будет переделать и под другой тип дерева.

Например если сконструировать дерево след. выражения
Код:
1+2*3
то вывод будет примерно таким
Код:
[+]-|
    |-[1]
    |
    |-[*]-|
    |     |-[2]
    |     |-[3]
Код:
#include <iostream>
#include <string>
#include <vector>

class Tree {
public:
    std::string value;
    std::vector<Tree> tree;
};

void printTree (Tree tree, int offsetWidth = 0, std::string offsetStr = "") {
    std::string str = "[" + tree.value + "]";
    std::string offset(offsetWidth + 1, ' '); // +1 because of '-' character on line 19
    offset = offset.replace(0, offsetStr.length(), offsetStr);
    int length = str.length();
    int size = tree.tree.size();
    if (offsetWidth > 0) {
        offset += "|";
        std::cout << offset << "-";
    }
    std::cout << str;
    if (size > 0) {
        std::cout << "-|\n";
        for (int i = 0; i < size; i++) {
            if (offsetWidth > 0) {
                printTree(tree.tree[i], length + offsetWidth + 3, offset); // +3 because of '[', ']', '-' characters
            }
            else {
                printTree(tree.tree[i], length + offsetWidth, offset);
            }
            if (i == size - 1) {
                std::cout << offset;
                std::cout << "\n";
            }
        }
    }
    else {
        std::cout << "\n";
    }
}

int main (int argc, char* argv[]) {
    print(tree);
    std::cin.get();
    return 0;
}

Последний раз редактировалось rudvil; 17.01.2010 в 22:02..
 
Ответить с цитированием