我目前正在尝试解决以下问题:
使用包装器 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 个参数 返回显示(p,3); ~~~~~~~ ^ ./Tree.h:137:1: 注意:此处声明“显示” void 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/