此TreeVisitor函数如何用于此二进制搜索树分配

时间:2019-02-02 03:27:41

标签: c++ function binary-search-tree

我对C ++来说还很陌生,所以为我的有限理解在此道歉,这也是我第一次发表在stackoverflow上的文章,对于格式错误,我深表歉意。

我正在做一个工作,我们正在建立一个二进制搜索树。在大多数情况下,我了解BST的工作原理。但是该分配具有几个内置函数,我对它们的工作方式有些困惑。从概念上讲,我知道BST的工作原理以及应该如何执行命令,但是在利用这些功能的范围内,我感到困惑。

对我而言,最不寻常的事情是调用函数作为参数并使用visit,这听起来像是内置的标准函数。

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具有此功能,可以测试main.cpp中的inorderTraversal

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 :(得分:0)

我忘记做家庭作业了吗?

无论如何:

treevisitor在做什么?

  • TreeVisitor是一个基本上通过字符串流累积字符串的类。它提供了一个“访问者”方法,每次调用它时,都会将该项目添加到字符串中。此类根本不遍历树,它只是为项目做某事(在此类中,将字符串表示形式添加到字符串中)。 inorder遍历或任何其他遍历都使用此方法(甚至不必在树上使用)。

我在treevisitor中存储什么?

  • 您要存储一个字符串流,该字符串流将按顺序累积其遇到的所有项的表示形式。

这里到底发生了什么:b1.InorderTraverse(TreeVisitor :: visitor);?这里传递的参数是什么,我假设是字符串流

  • 这会将TreeVisitor的visitor方法传递给InorderTraverse方法。然后,InorderTraverse将以递归方式遍历该树,并为它命中的每个节点调用该方法。

当调用InorderTraverse时,究竟要构建什么?我假设您想返回一些内容,但是我的假设是树访问者正在存储某些内容以获取字符串结果。

  • TreeVisitor再次以遍历顺序累积整个树的字符串表示形式。遍历完成后(每个节点都被击中),TreeVisitor :: GetSS方法将获取最终的字符串。

因为这看起来像是家庭作业,所以我可以:对您来说,有趣的部分是“顺序遍历”,该遍历遍历树,并在每个节点上调用给定函数。它是通过这种方式设计的,因此您可以传递不同的功能,但是遍历只编写一次。