【问题标题】:Overloading Recursive Function C++重载递归函数 C++
【发布时间】:2015-11-19 23:39:25
【问题描述】:

我正在努力实现一个基本的二叉搜索树。

我已经定义了一个递归函数来按顺序打印树

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

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

这样重载函数可以吗?

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

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

是否有另一种处理这种情况的方法,例如,我将为二叉搜索树实现的几乎所有递归函数都属于相同的情况。即第一次调用的参数始终是根节点。

【问题讨论】:

  • 你的程序中是否总是有一个树?
  • @Koborl 请不要忘记接受你最喜欢的答案

标签: c++ recursion


【解决方案1】:

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

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

  private:
    Node* m_root;
};

【讨论】:

    【解决方案2】:

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

    如果你想在你的程序中支持多棵树,那么无论何时你需要打印一棵树,你都需要指定你需要打印哪棵树。一个简单的方法是传递一个指向根节点的指针,但这正是你原来的非重载函数所做的。所以对于这样一个简单的情况,没有理由超载。

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

    【讨论】:

      【解决方案3】:

      将引导程序用于某些数据结构的此类方法是 100% 没问题的,甚至可能更有效。

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

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

      【讨论】:

      • root 成员应在 Tree 构造函数中初始化
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-13
      • 2021-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多