我目前正在尝试解决以下问题:
使用包装器void Tree :: levelOrder()编写函数void TreeNode :: levelOrder(int n)以使用递归打印树级别顺序
这是类头:
#ifndef TREE_H
#define TREE_H
#include <algorithm>
class TreeNode {
private:
int key;
TreeNode *left;
TreeNode *right;
public:
TreeNode(int key);
void insert(int key);
void display(TreeNode *p, int lvl);
void preOrder();
void inOrder();
void postOrder();
int size();
int height();
};
class Tree {
private:
TreeNode *root;
public:
Tree();
Tree(int *a, int n);
void insert(int key);
void preOrder();
void inOrder();
void postOrder();
void display(TreeNode *p);
int size();
int height();
};
void TreeNode::display(TreeNode *p, int lvl){
if (p!=NULL){
if (p->left) display(p->left, lvl + 4);
if (p->right) display(p->right, lvl + 4);
if (lvl) {
std::cout << std::setw(lvl) << ' ';
}
cout << p->key << "\n";
}
}
void Tree::display(TreeNode *p){
if (p!=NULL){
return display(p,0);
}
使用这两个功能,我仍然遇到以下错误:
“ ./Tree.h:139:20:错误:函数调用的参数过多,预期为单个
参数'p',有2个参数
返回display(p,3);
~~~~~~~ ^
./Tree.h:137:1:注意:此处声明为“显示”
无效Tree :: display(TreeNode * p){“
我不明白为什么编译器无法识别带有2个参数的TreeNode类中的函数。相反,编译器告诉我递归函数应该只包含一个参数。
我知道我很可能不了解这里的整体情况,所以有人可以为我解决这个问题吗?非常感谢。
最佳答案
问题在于这种方法:
void Tree::display(TreeNode *p){
if (p!=NULL){
return display(p,0);
}
return display(p,0);
表示return this->display(p,0);
并且编译器正确。您可能的意思是
p->display(p, 0);
。附带说明一下,两个类中的
display()
方法似乎都是静态方法(并且没有任何理由)。它们不使用用于调用它们的对象的属性。为了正确的OOP,您应该按如下所示重写它们:
void TreeNode::display(int lvl)
{
if (left) {
left->display(lvl + 4);
}
if (right) {
right->display(lvl + 4);
}
if (lvl) {
std::cout << std::setw(lvl) << ' ';
}
cout << key << "\n";
}
void Tree::display(){
if (root) {
root->display(0);
}
}
关于c++ - 编译器不了解递归函数以打印树级C++,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43711415/