[英]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.