Обходы через Tree .. В порядке проблемы с нарушением доступа к памяти - PullRequest
1 голос
/ 03 февраля 2011

Поэтому я написал для себя этот небольшой код для практики ...

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

ОБНОВЛЕНИЕ: я использую Visual Studio 2008 SP1 визуальный компилятор 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 Ответ

1 голос
/ 03 февраля 2011

Мое лучшее предположение: похоже, что вы никогда не устанавливали конечные дочерние узлы на 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;
}
...