所以我把这段代码的和平写下来作为我自己的实践......
但是我在traverse_inorder函数中遇到 * traverse_inorder(p-> left)* 内存访问冲突和程序崩溃。 为什么??? 有任何想法吗?
更新:我正在使用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);
}
}
答案 0 :(得分: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;
}