我有一个函数,按从左到右的顺序打印树节点。
void PrintTree()
{
...
Print(curentNode);
...
}
但是现在我希望添加一个函数,打印出满足某些条件的节点。例如,只打印那些字符串以给定字符串开头的节点。这将会像这样:
void PrintTreeByCondition(string a)
{
...
if(IsPrefix(a,curentNode->stringVar))
Print(curentNode);
...
}
但是我有两个函数的代码相同,仅有一行不同。如何避免出现代码重复?
更新:遍历代码:
void BinTree::TraverseTree()
{
std::stack<TreeNode*> s;
s.push(root);
TreeNode* curentNode = s.top();
while (curentNode != nullptr|| s.empty() == false)
{
while (curentNode != nullptr)
{
s.push(curentNode);
curentNode = curentNode->GetLeft();
}
curentNode = s.top();
s.pop();
// do stuff
curentNode = curentNode->GetRight();
}
}
void TraverseTree(void (*f)(const CTreeNode*))
。但是之后我就不知道如何实现第二个行为了。 - IvanIvanoperator()
的对象。 - PaulMcKenzietraverse()
函数为每个节点传递的参数。例如,如果您的树节点包含一个T
对象作为它们的值,则该函数可能会以T const&
作为参数。根据traverse()
函数是否是函数模板,它将使用带有可调用T const&
的[n隐式]概念的模板参数作为其访问者函数。如果它不是一个模板,它可能会以std::function<void(T const&)>
作为参数。 - Dietmar Kühl