我对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语句不会消除错误。
答案 0 :(得分:0)
我忘记做家庭作业了吗?
无论如何:
treevisitor在做什么?
我在treevisitor中存储什么?
这里到底发生了什么:b1.InorderTraverse(TreeVisitor :: visitor);?这里传递的参数是什么,我假设是字符串流
当调用InorderTraverse时,究竟要构建什么?我假设您想返回一些内容,但是我的假设是树访问者正在存储某些内容以获取字符串结果。
因为这看起来像是家庭作业,所以我可以:对您来说,有趣的部分是“顺序遍历”,该遍历遍历树,并在每个节点上调用给定函数。它是通过这种方式设计的,因此您可以传递不同的功能,但是遍历只编写一次。