Binary Search insertion de récursion Tree

voix
0

Je suis actuellement avoir des difficultés à insérer un nœud dans un arbre binaire en utilisant récursion. J'ai logements sur ce problème depuis quelques jours maintenant et je pensais qu'il était temps que je suis venu chercher des réponses!

classe 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 classe pour mettre en œuvre la structure de données d'arbre binaire (.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

La mise en œuvre de la fonction membre d'insertion que je utilise pour insérer des noeuds dans l'arbre:

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

Je ne comprends pas pourquoi cette insertion ne fonctionne pas. Le code semble impeccable et il m'a laissé me gratter la tête. J'ai écrit une fonction d'insertion alternative qui utilise l'itération, mais récursion est un must.

Toute aide serait fantastique, je vous remercie.

Créé 26/10/2011 à 09:50
source utilisateur
Dans d'autres langues...                            


1 réponses

voix
2

Le problème est ici:

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

node_ptrest une variable locale, parce que vous passez par valeur. Ainsi, l'affectation est perdue lorsque vous quittez la fonction.

Pour résoudre ce problème - passer par référence:

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

Cela exigera ces changements, bien sûr:

        student* & left(void);
        student* & right(void);
Créé 26/10/2011 à 09:56
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more