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



我对C++还很陌生,所以提前为我的理解有限而道歉,而且这是我在stackoverflow上的第一篇文章,如果格式错误,我很抱歉。

我正在做一项任务,我们正在构建一个二进制搜索树。在大多数情况下,我理解BST是如何工作的。但任务中有几个内置函数,我对它们的工作方式有点困惑。从概念上讲,我知道BST是如何工作的,以及有序器应该如何表现,但在使用这些功能的范围内,我感到困惑。

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

树访问者在做什么

我在treevisitor中存储了什么

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

调用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 中测试我们的interderTraversal

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语句不会回击错误。

家庭作业怎么了,我忘了。。。

总之:

树客在干什么?

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

我在treevisitor中存储了什么?

  • 您正在存储一个字符串流,它将按顺序累积遇到的所有项的表示

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

  • 这是将TreeVisitor的访问者方法传递给InorderTraverse方法。然后,InorderTraverse将递归遍历树,并为它命中的每个节点调用该方法

调用InorderTraverse时究竟在生成什么?我假设您想要返回一些东西,但我的假设是树访问者正在存储一些东西以获得字符串结果。

  • TreeVisitor再次按遍历顺序累积整个树的字符串表示。遍历完成后(每个节点都已命中),TreeVisitor::GetSS方法将获得最后一个字符串

因为这看起来像是家庭作业,如果可以的话:对你来说,有趣的部分是"按顺序遍历",它递归地遍历树,并在每个节点上调用给定的函数。它是这样设计的,这样你就可以传递不同的函数,但遍历只写一次。

最新更新