2011-10-26 23 views
0

現在、再帰を使用してノードをバイナリツリーに挿入するのが難しいです。私は数日間この問題に住んでいましたが、答えを探す時が来たと思いました!バイナリ検索ツリー再帰挿入

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); 
    } 
} 

この挿入が機能しない理由はわかりません。コードは完璧に見え、頭が傷ついてしまった。私は反復を使用する代わりの挿入関数を書いたが、再帰は必須である。

ご協力いただきありがとうございます。ありがとうございます。

+0

を、あなたは学生のバイナリツリーを作成しようとしていますグレード別にソート?その場合、なぜnode_ptrが挿入メソッドに渡されますか?再帰的挿入メソッドをプライベートにすることを検討し、新しい学生のグレードと名前だけを取るpublic挿入メソッドを追加することを検討する必要があります。 – zennehoy

答えて

2

問題はここにある:あなたは値によってそれを渡すため

if(node_ptr == NULL) 
{ 
    node_ptr = new student(grade, name); 
    return; 
} 

node_ptrは、ローカル変数です。したがって、関数を終了すると、割り当てが失われます。それを修正する

- 参照渡し:

void BTTree::insert(student* &node_ptr, const float grade, std::string name) 

もちろん、これらの変更、必要になります。物事のルックスでは

 student* & left(void); 
     student* & right(void); 
+0

私はポインタ/参照変数を関数に渡すことで、Cの状態に巻き込まれました。 ありがとう、あなたは私に数時間の手間をかけてくれました! – urthwrm

関連する問題