c++ - 编译器不理解递归函数来打印树级顺序 C++

标签 c++ class recursion data-structures binary-search-tree

我目前正在尝试解决以下问题:

使用包装器 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/

相关文章:

c++ - 如何强制long为4字节

c++ - 析构函数/释放内存的问题

Java递归列出特定模式目录中的文件

c++ - C++中任意长度字符串的字符串替换

c++ - LLVM异常处理错误

c++ - 为什么指针返回值而不是地址?

algorithm - 将递归转换为尾递归

python - 如何迭代和过滤对象方法?

class - flutter 的语法含义

c++ - 检查树节点等于一个值