2016-04-10 23 views
1

Ekleme işlevimin doğru olduğuna inanıyorum, ancak yeni düğüm ağacın içine takılmamış gibi görünüyor. Hata nerede olduğunu anlayamadım. Herhangi bir yardım için teşekkür ederim, teşekkürler. düğüm ve ağacın beyanı yokturİkili ağaçta yeni bir düğüm eklenemiyor

: Ben ana işlevi çağırdığınızda yeni bağlantı vermiyor gibi

int Tree::init(){ 
    this->root = NULL; return 1; 
} 

Node *Tree::insert(int key, Node *p){ 
    if(p == NULL){ 
    Node *novo = new Node(); 
    novo->key = key; 
    novo->left = NULL; 
    novo->right = NULL; 
    p = novo; 
    } 
    else if(key < p->key){ p->left = insert(key, p->left); } 
    else if(key > p->key){ p->right = insert(key, p->right); } 
    else{ cout << "Error: key already exist" << endl; } 

return p; 
} 

, görünüşe:

class Node{ 
    int key; 
    Node *right, *left; 
} 

class Tree{ 
public: 
     int init(); 
     Node *root; 
     Node *insert(int key, Node *p); 
}; 

işlevleri vardır düğüm

int main() { 
    Tree dictionary; 

    cout << "enter the key"; cin >> key; 

    dictionary.insert(key, dictionary.root); 

    cout << dictionary.root->key; 
} 
+0

Konu dışı: neden bir kurucu yerine Tree :: init() '? – user4581301

+0

'MCVE'nuz derlenmiyor - gcc ile denedim. –

cevap

1

Insert() işlevinizde, ağaç boş olduğunda veya son düğüme ulaşmışsanız, siz yeni bir düğüm te:

if(p == NULL){ 
    Node *novo = new Node(); 
    novo->key = key; 
    novo->left = NULL; 
    novo->right = NULL; 
    p = novo;    // ouch !!!! 
    } 

Maalesef açıklamada p=novo yalnızca fonksiyonun yerel parametresini p günceller. Fonksiyondan döndüğünüzde değeri kaybolur. İşlevinizi çağırdığınız işaretçiyi güncelleştirmez. Böylece ağacınızın kökü NULL (veya son düğümün sol/sağ göstericisi) olarak kalır.

Node *insert(int key, Node *& p); // p is passed by reference 

Bu irade:

beklediğiniz etkiyi elde etmek için, karşı imza değiştirmeniz gerekir (yani sizin p atama kök işaretçisi veya son düğümün/sağa sola işaretçi günceller) işaretçiyi p referans alarak geçirin. P'yi değiştirmek, daha sonra işlevi çağırmak için kullandığınız imleci değiştirme etkisine sahip olacak ve ekleme işleminin kalıcı etkisini artıracaktır.

+0

Ayrıca, "main" da "dictionary.root" un başlatılmamış değişkenini geçtiğini ve asla çalışamayacağını belirtmeyi de unutmuştunuz. –

+0

Teşekkür ederim Christophe !!! Seally egzersiz ama bu detayı fark edemedim –

+0

@AlBundy evet, çünkü OP init() çağırmayı unutmuştu. Init() yerine bir kurucu yapmak, bu tür kötü hatalardan kaçınacaktır ;-) – Christophe