重载递归函数C++

Overloading Recursive Function C++

本文关键字:C++ 递归函数 重载      更新时间:2023-10-16

我正在实现一个基本的二进制搜索树。

我定义了一个递归函数,用于按顺序打印树

void printTree(Node *n){
    if (n){
        printTree (n -> left);
        n -> printNode();
        printTree (n -> right);
    }   
}

当调用这个函数时,我通常总是用Node*n的初始值作为指向根节点的指针来调用它。

这样重载函数可以吗。

void printTree()  {printTree(root);};

这是处理递归函数的公认方法吗?在递归函数中,第一次调用的参数总是相同的/使用相同的指针/变量等。

有没有其他方法可以处理这种情况,例如,我将为二进制搜索树实现的几乎所有递归函数都属于相同的情况。即,第一次调用的自变量总是根节点。

如果root是类的成员并且它在类构造函数中初始化,则可以重载它。

class Tree
{
  public:
    Tree() : m_root(new Node()) { }
    void printTree(Node *n);
    void printTree() { printTree(m_root); }
  private:
    Node* m_root;
};

您提供的版本有一个很大的缺点:对printTree()的调用将始终打印一个特定的树。这使得您的代码几乎不可能重用;如果您的程序中需要两个树,您会怎么做?

如果您想在程序中支持多个树,那么无论何时需要打印树,都需要指定需要打印的树。一个简单的方法是将指针传递给根节点,但这正是原始非重载函数所做的。因此,对于这样一个简单的案例,没有理由过载。

然而,更现实的情况可能是您有一个单独的class Tree,它与Node类不同。在这种情况下,您可能需要Tree::print(Node*)来打印子树,而使用重载的Tree::print()来打印整个树。在这种情况下,典型的用法是按照tree.print();,这里tree变量已经指定了要打印的树,重载是有意义的,使用起来很方便。

对某些数据结构使用类似方法的自举是100%好的,甚至可能更高效。

如果是这种情况,请以这样的方式设置类,即主printTree方法是私有的,引导程序是这样调用的公共方法:

class Tree
{
    private:
        Node *root;
        void printTree(Node *n);
    public:
        ...
        ...
        void printTree();
};
void Tree::printTree()
{
    printTree(root);
}