İkili Arama Ağacı tekrarlama ekleme

oy
0

Şu anda Özyinelemeyi kullanarak ikili ağacına bir düğüm ekleme zorluk yaşıyorum. Şimdi birkaç gündür bu sorun üzerinde konut ve ben yanıt arayan geldi zamanının geldiğini düşündüm oldum!

Düğüm sınıfı (.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 sınıf İkili Ağacı veri yapısını (.h) uygulamaya:

#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

Ben ağaca düğümleri eklemek için kullanıyorum geçme eleman fonksiyonu uygulaması:

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

Bu ekleme çalışmıyor neden anlamıyorum. Kod kusursuz görünüyor ve kafamı çizilmeye Beni terk etti. Ben tekrarlanmasını kullanır alternatif yerleştirme işlevini yazdım, ancak yineleme bir zorunluluktur.

Herhangi bir yardım harika olurdu, teşekkürler.

Oluştur 26/10/2011 saat 09:50
kaynak kullanıcı
Diğer dillerde...                            


1 cevaplar

oy
2

Sorun buradadır:

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

node_ptrEğer değeriyle geçmek çünkü yerel bir değişken vardır. Eğer işlevi çıktığınızda Böylece atama kaybolur.

Düzeltmek için - referans olarak geçmektedir:

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

Yani tabii ki bu değişiklikleri, gerektirecektir:

        student* & left(void);
        student* & right(void);
Cevap 26/10/2011 saat 09:56
kaynak kullanıcı

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