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

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

10-11 21:57
查看更多