現在、再帰を使用してノードをバイナリツリーに挿入するのが難しいです。私は数日間この問題に住んでいましたが、答えを探す時が来たと思いました!バイナリ検索ツリー再帰挿入
Nodeクラス(.H):
#ifndef STUDENT_MACROGUARD
#define STUDENT_MACROGUARD
#include <cstdlib>
#include <string>
namespace student_class
{
class student
{
public:
// Constructors/Destructors;
student(const float entry = 0, std::string name = "",
student* left_ptr = NULL, student* right_ptr = NULL);
~student(void){};
// Mutating member functions;
void set_grade(const float entry);
void set_name(std::string entry);
void set_left(student* node_ptr);
void set_right(student* node_ptr);
// Non mutating member functions;
float grade(void);
std::string name(void);
student* left(void);
student* right(void);
// Const member functions;
const student* left(void) const;
const student* right(void) const;
private:
std::string student_name;
float grade_field;
student* left_ptr;
student* right_ptr;
};
}
#endif
BSTreeクラスバイナリツリーデータ構造(.H)を実装するために:私は挿入するために使用してい
#ifndef BTTree_MACROGUARD
#define BTTree_MACROGUARD
#include <cstdlib>
#include <string>
#include <iostream>
#include "student.h"
using namespace student_class;
namespace BTTree_class
{
class BTTree
{
public:
// Constructors/Destructors;
BTTree(student* node_ptr = NULL);
~BTTree(void);
// Mutating member functions;
void insert(student* node_ptr = NULL, const float grade = 0, std::string name = "");
void remove(student* node_ptr);
// Non mutating member functions;
student* grade_search(const float entry);
student* name_search(const std::string entry);
student* root(void);
void print_tree(student* node_ptr);
// Const member functions;
const student* grade_search(const float entry) const;
const student* name_search(const float entry) const;
const student* root(void) const;
private:
student* root_ptr;
};
}
#endif
挿入メンバ関数の実装をノードをツリーに追加します。
void BTTree::insert(student* node_ptr, const float grade, std::string name)
{
if(root_ptr == NULL)
{
root_ptr = new student(grade, name);
return;
}
if(node_ptr == NULL)
{
node_ptr = new student(grade, name);
return;
}
else if(node_ptr->grade() > grade)
{
insert(node_ptr->left(), grade, name);
}
else
{
insert(node_ptr->right(), grade, name);
}
}
この挿入が機能しない理由はわかりません。コードは完璧に見え、頭が傷ついてしまった。私は反復を使用する代わりの挿入関数を書いたが、再帰は必須である。
ご協力いただきありがとうございます。ありがとうございます。
を、あなたは学生のバイナリツリーを作成しようとしていますグレード別にソート?その場合、なぜnode_ptrが挿入メソッドに渡されますか?再帰的挿入メソッドをプライベートにすることを検討し、新しい学生のグレードと名前だけを取るpublic挿入メソッドを追加することを検討する必要があります。 – zennehoy