2015-01-19 5 views
0

Я пытаюсь реализовать двоичное дерево в C++ и перевернуть его в корне-влево-вправо. После добавления всех узлов я получаю сбой в этой строке:Двоичное дерево в C++

cout << r->st->st->info << endl; //trying to print root->left->left->info 

Моя функция RSD ничего не печатает. Кроме того, я был бы признателен за любые руководства по Visual Studio о том, как использовать отладчик. Спасибо.

#include<iostream> 
using namespace std; 

struct Nod{ 
    int info; 
    Nod *st, *dr; 
}; 

int read_tree(Nod *r) 
{ 
    int info; 
    cout << "Info: "; cin >> info; 
    if (info!=0) 
    { 
     r = new Nod; 
     r->info = info; 
     read_tree(r->st); 
     read_tree(r->dr); 
    } 
    else 
     return 0; 
} 

void RSD(Nod *r) 
{ 
    if (r != NULL) 
    { 
     cout << r->info << " "; 
     RSD(r->st); 
     RSD(r->dr); 
    } 
} 

int main() 
{ 
    Nod *r = NULL; 
    read_tree(r); 
    system("Pause"); 
    cout << r->st->st->info << endl; 
    cout << r->dr->info; 
    RSD(r); 
} 
+2

Какова ценность 'r' сразу после вызова read_tree(). Это NULL? – 2501

+0

После того, как вызов 'read_tree()' завершен, откуда вы знаете, что есть как минимум 2 'st' (левый ребенок) и не менее 1' dr' (правый ребенок)? – CinCout

ответ

3

Проблема заключается в том, что вы передаете копию указателя на read_tree функции. То есть, когда вы вызываете read_tree(r) в основную функцию, r остается NULL независимо от того, что происходит внутри функции read_tree. Вы можете исправить это, передав указатель по ссылке. То есть, изменение read_tree(Nod* r) на read_tree(Nod*& r) должно исправить это.

+0

Я понимаю сейчас. Еще одна проблема теперь в том, что я получаю подавление в своей функции RSD на 'cout << r-> info <<" ";'. Что это значит? Спасибо, – Shury

+0

@Shury Когда вы назначаете «новый Nod', указатели' st' и 'dr' не инициализируются. Они не гарантированно будут «NULL». Вы можете инициализировать их в конструкторе 'Nod'. – kraskevich

Смежные вопросы