#c #binary-tree
#c #двоичное дерево
Вопрос:
Мое упражнение состоит в том, чтобы вставить элементы в BSTree и найти его максимальный элемент. После того, как я это сделал, он ничего не печатает и всегда возвращает 0. Я пробовал с функцией печати, но это было то же самое, я не знаю причины. Пожалуйста, помогите. Заранее спасибо………………………………………………………………………………………………………………………………………….
#include <iostream>
using namespace std;
struct BstNode {
int data;
BstNode *left;
BstNode *right;
BstNode(int data1, BstNode *left1 = nullptr, BstNode *right1 = nullptr) : data(data1), left(left1), right(right1) {}
~BstNode() {}
};
class BinTree {
private:
BstNode *root;
public:
BinTree() : root(NULL) {}
~BinTree() {}
BstNode *Insert(int data, BstNode *root) {
if (root == NULL) {
root = new BstNode(data);
return root;
}
while (data <= root->data) {
if (root->left == NULL) {
root->left = new BstNode(data);
}
Insert(data, root->left);
}
while (data <= root->data) {
if (root->right == NULL) {
root->right = new BstNode(data);
}
Insert(data, root->right);
}
}
int FindMax() {
MaxHelper(root);
}
int MaxHelper(BstNode *root) {
if (root == NULL) {
cout << "List is empty ";
return -1;
} else if (root->right != NULL) {
root = root->right;
}
return root->data;
}
void Preorder(BstNode *root) { //DLR
if (root == NULL) {
return;
}
cout << root->data;
Preorder(root->left);
Preorder(root->right);
}
};
BstNode *root = new BstNode(10);
int main() {
BinTree b;
cout << b.Insert(5, root);
cout<<b.Insert(6, root);
cout << b.Insert(7, root);
cout << b.FindMax();
return 0;
}
Комментарии:
1.
BinTree::FindMax
иBinTree::Insert
обещают возвращать значения, но, похоже, не всегда выполняют обещание. Я бы обратился к этому, прежде чем продолжить.2. Вас трудно понять, можете ли вы по-другому исправить то, что я должен исправить?
3. Любая непустотная функция всегда должна
return
что-то делать. Если это не так, у вас проблемы.4. Я бы рекомендовал: 1- просмотр вашей программы с помощью отладчика. 2- попытка немного больше понять рекурсивность. 3- написание более простых рекурсивных задач, таких как факториал и последовательность Фибоначчи, перед выполнением этой.
5. Вся ваша программа неверна (где используется рекурсивность) Я пытался написать решение, но обнаружил, что мне следует переписать большую его часть.
Ответ №1:
Во-первых, вы должны включить комментарии в свой код, чтобы другие могли понять. И я нашел много ошибок в вашем коде.
Первое, на что следует обратить внимание, это то, что если у вас есть функция, не являющаяся пустой, она должна что-то возвращать.
И using namespace std;
загрязняют пространство имен. Следовательно, используйте
using std::cout;
using std::endl;
И нет необходимости иметь отдельную структуру, если вы используете классы в своем файле. Попробуйте реализовать это внутри класса.
И root == NULL
может быть изменен как !root
.
И ваша функция вставки имеет логические ошибки.
И если вы возвращаете что-то в операторе if, не нужно использовать else if, просто используйте if .
И лучше использовать два отдельных файла для основного и реализации и использовать его в качестве файла заголовка.
И защитите ваши заголовочные файлы от многократного включения.
И бла-бла-бла …;)
Здесь я исправил некоторые из ваших ошибок. но не все, попробуйте исправить их все самостоятельно.
#include <iostream>
using std::cout;
using std::endl;
struct BstNode
{
int data;
BstNode *left;
BstNode *right;
BstNode(int data1) : data(data1), left(NULL), right(NULL){};
~BstNode(){};
};
class BinTree
{
private:
BstNode *root;
public:
BinTree() : root(NULL) {}
~BinTree() {}
BstNode *Insert(int data, BstNode *root)
{
if (!root)
{
return new BstNode(data);
}
if (data > root->data)
{
root->right = Insert(data, root->right);
}
else
{
root->left = Insert(data, root->left);
}
return root;
}
int FindMax(BstNode *root)
{
return MaxHelper(root);
}
int MaxHelper(BstNode *root)
{
if (!root)
{
return -1;
}
if (root->right)
{
root = root->right;
}
return root->data;
}
void Preorder(BstNode *root)
{
if (!root)
return;
Preorder(root->left);
cout << root->data << " ";
Preorder(root->right);
}
};
int main()
{
BstNode *root = new BstNode(10);
BinTree b;
b.Insert(5, root);
b.Insert(6, root);
b.Insert(7, root);
b.Insert(11, root);
cout << b.FindMax(root) << endl;
b.Preorder(root);
return 0;
}