Запрос на член не-классового типа

0

Я пытался реализовать BST, но я все время застреваю со следующей ошибкой при компиляции:

bstavl.cpp: In member function ‘bool BSTree::find(int):
bstavl.cpp:114:15: error: request for member ‘find in ‘((BSTree*)this)->BSTree::root->BSTNode::left, which is of non-class type ‘BSTNode*
bstavl.cpp:120:16: error: request for member ‘find in ‘((BSTree*)this)->BSTree::root->BSTNode::right, which is of non-class type ‘BSTNode*

Я реализую структуру BSTNode, а класс BSTree использует указатель BSTNode в качестве корня. Здесь объявление классов и структуры:

struct BSTNode {
//---------------------------------------------------------------------
//instance variables 
int value; 
bool deleted;
struct BSTNode *left;
struct BSTNode *right;
int height;

//---------------------------------------------------------------------
//constructors

//non argumented constructor
BSTNode() {
    this->value     = 0;
    this->height    = 0;
    this->left      = NULL;
    this->right     = NULL;
    this->deleted   = false;
}

//given value
BSTNode(int value) {
    this->value     = value;
    this->height    = 0;
    this->left      = NULL;
    this->right     = NULL;
    this->deleted   = false;
}

//given value, left pointer, right pointer
BSTNode(int value, BSTNode *left, BSTNode *right) {
    this->value     = value;
    this->height    = 0;
    this->left      = left;
    this->right     = right;
    this->deleted   = false;
}
};

//=====================================================================

class BSTree : public BSTNode {
BSTNode *root;

public: 
BSTree();
BSTree(int);
bool isEmpty(); //check if the bst is empty
void insert(int newValue); //inserts an int into the bst. Returns success
bool find(int value); //searches bst for int. True if int is in tree
void preorder(); //calls recursive transversal
void inorder(); //calls recursive traversal
void postorder(); //calls recursive transversal
int height(BSTNode *n);
int totalheight(); //returns tot height. height of empty tree = -1
int totaldepth(); //returns tot depth. depth of empty tree = -1
int avgheight(); //returns avg height of tree
int avgdepth(); //returns avg depth of tree
bool remove(int value); //deletes int. returns true if deleted

private:
struct BSTNode* insertRecursive(struct BSTNode *n, int newValue);
void inorderRecursive(BSTNode *n); //traverses tree in inorder
void preorderRecursive(BSTNode *n); //traverses tree in preorder
void postorderRecursive(BSTNode *n); //traverses tree in preorder

};

Наконец, вот реализация для BSTree :: find

bool BSTree::find(int findMe){
if (root->value == findMe)
    return true;
else if (findMe < root->value){
    if (root->left != NULL)
        root->left.find(findMe);
    else
        return false;
}//else if
else if (findMe > root->value){
    if (root->right != NULL)
        root->right.find(findMe);
    else 
        return false;
}//else if
}//find

Любой совет, который вы можете предложить, будет отличным. Я попытался изменить линию

root->right.find(findMe); 

ко всем видам вещей, включая

(root->right).find(findMe); 
root->right->find(findMe);
(root->right)->find(findMe);

и много других, но с ошибками при компиляции. Я знаю, что это, вероятно, простое исправление, но я потратил часы на эту тупую простую функцию без каких-либо успехов, и это действительно начинает расстраивать меня. Благодарю!

Теги:
binary-search-tree

1 ответ

0

Это в основном сводится к тому, что BSTNode не имеет метода find.

И ваш метод find настоящее время использует root, который не определен в BSTNode.

Я предлагаю вам отойти от наследования дерева с узла. Поскольку дерево не является узлом (оно просто содержит одно), это наследование не особенно хорошо.

Скорее создайте еще один класс BSTGeneric который BSTGeneric все ваши реализации на дереве (такие методы, как find будут здесь, так как он будет выглядеть одинаково для всех BST, другие методы могут быть объявлены здесь как чистые виртуальные).

Затем для каждой текущей рекурсивной функции добавьте еще одну, которая принимает параметр BSTNode *, который должен быть закрытым, и пусть текущая функция просто вызывает это.

Итак, вместо:

public: void insert(int value)
{
  ...
  root->left->insert(value);
  ...
}

У нас будет:

public: void insert(int value)
{
  insert(root, value);
}

private: void insert(BSTNode n, int value)
{
  ...
  insert(n.left, value);
  ...
}
  • 0
    Зачем мне добавлять параметр BSTNode? Не противоречит ли это цели определения функции в классе? У меня есть следующий класс, AVLTree, который я планирую реализовать, и мне нужно вызывать функцию с одинаковым именем двумя разными способами. Вот почему я определял его как метод класса для начала. Поскольку AVLTree также будет использовать BSTNode, это не сработает, не так ли?
  • 0
    Являются ли все узлы в вашей BSTree дерево BSTree объектов, или они BSTNode объектов?
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню