Binary Search Tree recursie inbrengen

stemmen
0

Ik ben op dit moment problemen met het plaatsen van een knooppunt in een binaire boom met behulp van recursie. Ik heb stil te staan ​​bij dit probleem voor een paar dagen nu en dacht dat het tijd dat ik kwam op zoek naar antwoorden was!

Node klasse (.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 klasse ter uitvoering van de Binary Tree datastructuur (.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

Het inzetstuk lid functie uitvoering Ik gebruik te knopen in de boom te voegen:

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

Ik begrijp niet waarom deze toevoeging niet werkt. De code ziet er onberispelijk en het liet me mijn hoofd krabben. Ik heb een alternatieve inbrengen functie die iteratie gebruikt geschreven, maar recursie is een must.

Alle hulp zou fantastisch zijn, dank je.

De vraag is gesteld op 26/10/2011 om 09:50
bron van user
In andere talen...                            


1 antwoorden

stemmen
2

Het probleem is hier:

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

node_ptris een lokale variabele, omdat je het passeren van de waarde. Zo wordt de opdracht verloren wanneer u de functie te verlaten.

Te repareren - voorbij referentie:

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

Dat zal deze veranderingen, natuurlijk moeten worden:

        student* & left(void);
        student* & right(void);
antwoordde op 26/10/2011 om 09:56
bron van user

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