簡體   English   中英

重載遞歸函數C ++

[英]Overloading Recursive Function C++

我正在努力實現一個基本的二進制搜索樹。

我已經定義了一個遞歸函數來按順序打印樹

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變量已經指定要打印的樹,並且重載是有意義的並且使用起來很方便。

對某些數據結構使用bootstraps這樣的方法是100%罰款,可能更有效。

如果是這種情況,請以某種方式設置類,以便主printTree方法是私有的,並且引導程序是被調用的公共方法,如下所示:

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

    public:
        ...
        ...
        void printTree();
};

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM