Я пытался реализовать 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);
и много других, но с ошибками при компиляции. Я знаю, что это, вероятно, простое исправление, но я потратил часы на эту тупую простую функцию без каких-либо успехов, и это действительно начинает расстраивать меня. Благодарю!
Это в основном сводится к тому, что 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);
...
}
BSTree
деревоBSTree
объектов, или ониBSTNode
объектов?