重载递归函数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
变量已经指定了要打印的树,重载是有意义的,使用起来很方便。
对某些数据结构使用类似方法的自举是100%好的,甚至可能更高效。
如果是这种情况,请以这样的方式设置类,即主printTree
方法是私有的,引导程序是这样调用的公共方法:
class Tree
{
private:
Node *root;
void printTree(Node *n);
public:
...
...
void printTree();
};
void Tree::printTree()
{
printTree(root);
}
相关文章:
- 递归函数计算序列中的平方和(并输出过程)
- 如何在Elixir中调用递归函数并行
- 递归函数有效,但无法记忆
- 为什么我的递归函数按降序打印,然后按升序打印?
- 为什么递归函数的最终输出是 5?
- 有没有办法使用递归函数找到数组中最小值的 INDEX?C++
- 如何将记忆应用于此递归函数?
- 如何从递归函数中完全返回,该函数给出了每个函数结果的累积相加?
- 无穷大而循环时具有递归函数
- 即使没有调用这个递归函数,它是如何工作的?
- 如何使此递归函数从给定的起始位置返回最小的整数?
- 此递归函数的每次迭代的值存储在哪里?
- 可以清除递归函数中的变量吗?
- 如何在递归函数调用中返回当前函数值
- 递归函数 c++ 的复杂性
- 这个递归函数有什么作用?运行时的复杂性是多少?
- 任何人都可以查明我的递归函数中的错误吗?
- 递归函数的返回类型推导
- 递归函数调用在后台工作
- 查找存储在二叉搜索树的所有非叶子中的数据总和?(返回整数的独立递归函数