开发者

Traversals through Tree.. In order problem with memory access violation

开发者 https://www.devze.com 2023-02-08 03:38 出处:网络
So I wrote up this little peace of code as practice for myself... But i am getting in travers_inorder function at line *traverse_inorder(p->left)*memory access violation and program crashes.

So I wrote up this little peace of code as practice for myself...

But i am getting in travers_inorder function at line *traverse_inorder(p->left)* memory access violation and program crashes. Why??? Any ideas?

UPDATE: I am using visual studio 2008 SP1 an visual C++ compiler

#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_tr开发者_如何学JAVAee(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);
}
} 


My best guess: looks like you never actually set your final child nodes to NULL in your tree generation procedure. As such, your conditional to stop traversing is never hit, as left and right are just uninitialized pointers. In populate_rand_tree, do the following:

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

Alternatively, since you are using C++...

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

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

精彩评论

暂无评论...
验证码 换一张
取 消