Binarne drzewo poszukiwań rekurencji wstawiania

głosy
0

Jestem obecnie trudności z włożeniem węzeł w drzewie binarnym przy użyciu rekursji. Byłem mieszkania na ten problem na kilka dni teraz i myślę, że nadszedł czas Szukałem odpowiedzi!

klasa 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 klasa zaimplementować strukturę dane binarne drzewo (.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

Realizacja funkcji wkładka Używam wstawić węzły do ​​drzewa:

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

Nie rozumiem, dlaczego ta wstawka nie działa. Kod wygląda bez zarzutu i to mnie opuścił zarysowania głowę. Pisałem alternatywną funkcję wstawiania który używa iteracji, ale rekursji jest koniecznością.

Każda pomoc będzie fantastyczna, dziękuję.

Utwórz 26/10/2011 o 09:50
źródło użytkownik
W innych językach...                            


1 odpowiedzi

głosy
2

Problemem jest tutaj:

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

node_ptrjest zmienną lokalną, bo przekazać go przez wartość. Zatem zadanie jest stracone, gdy wyjście z funkcji.

Aby go naprawić - przechodzić przez odniesienie:

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

Które będą wymagać te zmiany, oczywiście:

        student* & left(void);
        student* & right(void);
Odpowiedział 26/10/2011 o 09:56
źródło użytkownik

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