2016-04-19 31 views
-1

私はC++のプロジェクトで、配列の項目を挿入するバイナリ検索ツリーを作成する必要があります。私は、次の挿入アルゴリズムを使用する必要があります。C++バイナリ検索ツリーの実装

ツリー挿入(T、Z)

y = NIL 
x = T.root 
while x != NIL 
    y = x 
    if z.key < x.key 
     x = x.left 
    else x = x.right 
z.p = y 
if y == NIL 
    T.root = z 
else if z.key < y.key 
    y.left = z 
else y.right = z 

ここでは、私がこれまで持っているものです。

#include <iostream> 
using namespace std; 

struct node 
{ 
    int key; 
    node* left; 
    node* right; 
    node* p; 
    node* root; 
}; 

void insert(node*, node*); 
void printinorder(node*); 

int main() 
{ 
    node *root; 
    node* tree = new node; 
    node* z = new node; 
    int array [10] = {30, 10, 45, 38, 20, 50, 25, 33, 8, 12}; 

    for (int i = 0; i < 10; i++) 
    { 
     z->key = array[i]; 
     insert(tree, z); 
    } 

    printinorder(tree); 

    return 0; 
} 

void insert(node *T, node *z) 
{ 
    node *y = nullptr; 
    node* x = new node; 
    x = T->root; 
    while (x != NULL) 
    { 
     y = x; 
     if (z->key < x->key) 
      x = x->left; 
     else 
      x = x->right; 
    } 
    z->p = y; 
    if (y == NULL) 
     T->root = z; 
    else if (z->key < y->key) 
     y->left = z; 
    else 
     y->right = z; 
} 

void printinorder(node *x) 
{ 
    if (x != NULL) 
    { 
     printinorder(x->left); 
     cout << x->key << endl; 
     printinorder(x->right); 
    } 
}  

私が実行したときにこのコードは、しかし、コンパイルそれは、seg faultsです。問題は、私が作成しているノードや関数呼び出しのノードと関係があると思います。 ご協力いただきありがとうございます。

+0

あなたは何も信じてはいけません。デバッガを使用すると、失敗した箇所に正確に移動します。そこから行ってください。 –

+2

'node * x =新しいノード。 x = T-> root; 'が直ちに漏れます。 –

+0

@AlanStokesはそれを釘付けます。あなたは新しいノードを失い、それは決して挿入されません。前のポインタがある場合は、リストをたどるために2つのポインタは必要ありません。 xの代わりにyをトラバースします。 –

答えて

1

コメントに記載されている問題以外に、このコードの最大のバグは、新しいnodeのすべてのポインタをNULLに初期化するコンストラクタがないことです。

このように、作成するnodeには、ランダムなガベージを含むポインタがあります。あなたはコードのいくつかを初期化しますが、ほとんどはそうではありません。初期化されていないポインタを使用しようとすると、すぐにクラッシュする可能性があります。

コメントに記載されているすべての問題を修正し、nodeクラス用の適切なコンストラクタを用意する必要があります。

関連する問題