如何不重复打印树的代码

Iva*_*van 4 c++ binary-tree code-duplication

我有一个从左到右打印树节点的函数。

void PrintTree()
{
...
Print(curentNode);
...
}
Run Code Online (Sandbox Code Playgroud)

但是现在我想添加一个函数来打印满足某些条件的节点。例如,只打印这样的节点,其中的字符串以给定的字符串开头。所以它看起来像

void PrintTreeByCondition(string a)
{
...
if(IsPrefix(a,curentNode->stringVar))
      Print(curentNode);
...
}
Run Code Online (Sandbox Code Playgroud)

但是后来我有两个具有相同代码的函数,不同之处在于一行。我将如何避免代码重复?

UPD:遍历代码:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

Die*_*ühl 6

C++ 方法是为遍历创建一个迭代器,并将其用于打印以及过滤或其他用途。遍历一棵树可能以双向方式完成,这也将允许大量算法对树进行访问。事实上,有序关联容器(例如,std::mapstd::set)通常实现为[平衡]二叉树,它们的迭代器进行有序遍历。

迭代的细节确实取决于树表示。关联容器通常使用父指针实现。如果没有这样的指针,每个迭代器将需要保持合适的空间来表示返回根的路径(标准库容器不能这样做,因为它们对迭代器稳定性有要求,这阻止了这种情况)。使用迭代器进行遍历的一点奇怪之处在于它并不直接适用于使用递归的实现。作为回报,迭代的控制权交给迭代器的用户。