2011-02-03 13 views
1

は、だから私は自分自身のための練習として、コードのこの小さな平和...全検索は

を書いたしかし、私はライン* traverse_inorder(P-でtravers_inorder機能で取得しています>左)*メモリアクセス違反とプログラムのクラッシュ。 なぜですか? アイデア

UPDATE:私は、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

私の最高の推測を使用しています:あなたが実際にあなたの木の生成手順にNULLに最終的な子ノードを設定したことがないように見えます。そのため、leftrightは初期化されていないポインタに過ぎないため、条件を満たすトラバースを停止することはありません。 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

のthatsそれを...感謝を! – grobartn

+0

@grobartn - 問題ありません。喜んで助けてください。 – James

+1

C++では、ポインタを初期化するために '0'または' nullptr'(C++ 0x)を使用してください。 'NULL'はC++の方が適切でない可能性があるCマクロです(その定義に依存します)。 –