2011-02-03 1 views
1

Так что я написал этот маленький мир кода как на практику для себя ...прохождений через Древо .. В проблеме порядка с нарушением доступа к памяти

Но я получаю в функции travers_inorder в строке * traverse_inorder (p- > left) * Нарушение доступа к памяти и сбоев программы. Почему ??? Любые идеи?

UPDATE: Я использую Visual Studio 2008 SP1 Visual C++ компилятор

#include <iostream> 
#include <time.h> 

using namespace std; 

struct tree_node 
{ 
tree_node *left; 
tree_node *right; 
int value; 
}; 
void populate_rnd_tree(tree_node *root, int cnt); 
void traverse_inorder(tree_node *p); 

int main() 
{ 
srand(time(NULL)); 
tree_node * nTmp = new tree_node; 

populate_rnd_tree(nTmp, 10); 

traverse_inorder(nTmp); 

return 1; 
} 

void populate_rnd_tree(tree_node *root, int cnt) 
{ 
tree_node *old = root, *left, *right; 

left = new tree_node; 
right = new tree_node; 

int val = 0; 
// exit condition 
if (cnt == 0) return; 

val = rand()%50; 
old->value = val; 
old->left = left; 
old->right = right; 

populate_rnd_tree(left, cnt-1); 
populate_rnd_tree(right, cnt-1); 

return; 
} 

void traverse_inorder(tree_node *p) 
{ 
if (p != NULL) 
{ 
    traverse_inorder(p->left); 
    cout << p->value << endl; 
    traverse_inorder(p->right); 
} 
} 

ответ

1

Моя догадка: Похоже, что вы никогда не установить свои конечные дочерние узлы в NULL в вашей процедуре генерации дерева. Таким образом, ваше условное прекращение перемещения никогда не попадает, поскольку left и right - это просто неинициализированные указатели. В populate_rand_tree, сделайте следующее:

if (cnt == 0) 
{ 
    old->left = NULL; 
    old->right = NULL; 
    return; 
} 

В качестве альтернативы, так как вы используете C++ ...

struct tree_node 
{ 
    tree_node() : left(NULL), right(NULL) { } 

    tree_node *left; 
    tree_node *right; 
    int val; 
} 
+0

Вот это ... спасибо! – grobartn

+0

@grobartn - без проблем. рад помочь. – James

+1

в C++, либо используйте '0', либо' nullptr' (C++ 0x) для инициализации указателей. 'NULL' - это C-макрос, который может быть непригоден (в зависимости от его определения), потому что C++ имеет более сильную типизацию .... Если я правильно помню. –