Δυαδική Αναζήτηση εισαγωγή αναδρομή Δέντρο

ψήφοι
0

Είμαι σήμερα με δυσκολία την εισαγωγή ενός κόμβου σε ένα δυαδικό δέντρο χρησιμοποιώντας αναδρομή. Έχω κατοικία σε αυτό το πρόβλημα για λίγες μέρες τώρα και σκέφτηκα ότι ήταν καιρός μου ήρθε ψάχνοντας για απαντήσεις!

class 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 κατηγορία για την εφαρμογή της δομής των δεδομένων Binary Tree (.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);
    }
}

Δεν καταλαβαίνω γιατί αυτή η εισαγωγή δεν λειτουργεί. Ο κώδικας φαίνεται άψογη και αυτό είναι που με άφησε ξύσιμο το κεφάλι μου. Έχω γράψει μια εναλλακτική λειτουργία εισαγωγής που χρησιμοποιεί επανάληψη, αλλά αναδρομή είναι απαραίτητη.

Οποιαδήποτε βοήθεια θα ήταν φανταστικό, σας ευχαριστώ.

Δημοσιεύθηκε 26/10/2011 στις 09:50
πηγή χρήστη
Σε άλλες γλώσσες...                            


1 απαντήσεις

ψήφοι
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);
Απαντήθηκε 26/10/2011 στις 09:56
πηγή χρήστη

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