-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です。問題は、私が作成しているノードや関数呼び出しのノードと関係があると思います。 ご協力いただきありがとうございます。
あなたは何も信じてはいけません。デバッガを使用すると、失敗した箇所に正確に移動します。そこから行ってください。 –
'node * x =新しいノード。 x = T-> root; 'が直ちに漏れます。 –
@AlanStokesはそれを釘付けます。あなたは新しいノードを失い、それは決して挿入されません。前のポインタがある場合は、リストをたどるために2つのポインタは必要ありません。 xの代わりにyをトラバースします。 –