Как эта функция TreeVisitor работает для этого назначения дерева двоичного поиска - PullRequest
0 голосов
/ 02 февраля 2019

Я довольно новичок в C ++, поэтому заранее извиняюсь за мое ограниченное понимание, а также за то, что это мой первый пост по stackoverflow, я прошу прощения за форматирование, если оно не так.

Я работаю над заданием, что мы строим дерево двоичного поиска.По большей части я понимаю, как работает BST.Но в задании было несколько встроенных функций, и я немного запутался в том, как они работают.Концептуально я знаю, как работает BST и как должен вести себя порядок, но в рамках использования этих функций я запутался.

Самым необычным для меня является вызов функции в качестве аргумента и использование посещения, которое звучит как встроенная стандартная функция.

Что делает treevisitor?

Что я храню в treevisitor?

Что именно здесь происходит: b1.InorderTraverse (TreeVisitor :: visitor) ;?Какой аргумент передается здесь, я предполагаю, что поток строк

Что именно создается при вызове InorderTraverse?Я бы предположил, что вы захотите что-то вернуть, но я предполагаю, что древовидный посетитель что-то хранит для получения строкового результата.

Заранее благодарю за любую предоставленную помощь и извинения, если я не былдостаточно краткий с тем, что я спрашиваю.

Этот фрагмент кода существует в bst_test.cpp

class TreeVisitor {
public:
    TreeVisitor() = delete;

    // insert output to SS rather than cout, so we can test it
    static stringstream SS;

    static string GetSS() {
    return SS.str();
    }

    static void ResetSS() {
    SS.str(string());
    }
    // instead of cout, insert item into a string stream
    static void visitor(const string &item) {
    SS << item;
    }

    // instead of cout, insert item into a string stream
    static void visitor(const int &item) {
    SS << item;
    }
};

Этот bst_test.cpp, предоставленный для использования, имеет это для проверки нашего inorderTraversal в main.cpp

TreeVisitor::ResetSS();
b1.InorderTraverse(TreeVisitor::visitor);
string result = "acfgx";
assert(TreeVisitor::GetSS() == result);

В нашем bst.hpp это есть, я добавил немного кода и вспомогательный метод, который вытащен из нашего учебника.

// Public function
void InorderTraverse(void visit(const T &item)) const {
    inOrder(visit, rootPtr);
}


// Private Helper function
void inOrder(void visit(const T &item), Node* Ptr) const{
    if(Ptr != NULL){
        inOrder(visit, Ptr->leftPtr);
        T item = Ptr->data;
        visit(item);
        inOrder(visit, Ptr->rightPtr);
    }
} 

Я считаю, что все это работает, потому что утверждение assert не возвращает ошибку.

1 Ответ

0 голосов
/ 02 февраля 2019

Какое дело с домашними заданиями, я забыл ...

В любом случае:

Что делает treevisitor?

  • TreeVisitor - это класс, который в основном накапливаетсястрока через поток строк.Он представляет метод «посетитель», который при каждом вызове добавляет элемент в строку.Этот класс вообще не пересекает дерево, он просто что-то делает для элемента (в этом классе добавляется строковое представление в строку).Это используется обходом inOrder или любым другим traversser (и даже не должен использоваться на дереве).

Что я храню в treevisitor?

  • вы храните поток строк, который накапливает представление всех элементов, с которыми он сталкивается в последовательности.

Что именно происходит здесь: b1.InorderTraverse (TreeVisitor :: visitor) ;?Какой аргумент передается здесь, я предполагаю, что поток строк

  • , который передает метод посетителя TreeVisitor к методу InorderTraverse.Затем InorderTraverse будет рекурсивно проходить по дереву и вызывать этот метод для каждого узла, к которому оно обращается.

Что именно создается при вызове InorderTraverse?Я бы предположил, что вы захотите что-то вернуть, но я предполагаю, что что-то хранится древовидным посетителем для получения строкового результата.

  • TreeVisitor, опять же, накапливает строковое представление всего деревав порядке обхода.Когда обход завершен (каждый узел был поражен), тогда методы TreeVisitor :: GetSS получают окончательную строку.

Поскольку это выглядит как домашняя работа, если можно: интересная часть этогоВы - «обход в порядке», который рекурсивно обходит дерево и вызывает данную функцию на каждом узле.Он спроектирован таким образом, что вы можете передавать различные функции, но обход записывается один раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...