1

だから私は、この再帰関数を使用して二分木に値を挿入しようとしています:

void add(node* *hd, int v){
node* curr = *hd;
if(curr == NULL){
    curr = (node*)malloc(sizeof(node));
    curr->value = v;
}else{
    if(v < curr->value){
        add(&curr->left, v);
    }else{
        add(&curr->right, v);
    }
}
}

機能していないようで、なぜこのようなことができないのか理解できません。どうすれば修正できますか?

4

6 に答える 6

6

ポインターは、スペースを割り当てるときに取得したものに設定される可能性があるため、ポインターを初期化する必要があります。あなたが渡すときはadd(&curr->left, v); curr->left、どこかのポインターではないかもしれませんが、まだそうではありませんNULL

void add(node* *hd, int v){
    node* curr = *hd;
    if(curr == NULL){
        curr = malloc(sizeof(node));
        curr->left = curr->right = NULL;
        curr->value = v;
        *hd = curr; // from Mohamed KALLEL
    }else{
        if(v < curr->value){
            add(&curr->left, v);
        }else{
            add(&curr->right, v);
        }
    }
}
于 2012-11-28T14:54:21.883 に答える
5

呼び出し元のポインターを変更するためにポインターcurrを書き込むのではなく、ローカル変数にポインターを格納しているだけなので、新しいノードは正しく「接続」されていません。*hd

また、Cの戻り値をキャストしないmalloc()でください。

于 2012-11-28T14:50:31.257 に答える
2
if(curr == NULL){
    curr = malloc(sizeof(node));
    curr->right = NULL;
    curr->left = NULL;  // From ks6g10 in order to initialize right and left to NULL
    curr->value = v;
    *hd = curr; // add this
}

ところで、callocの代わりに使用しmallocます。ノードメモリを初期化します0

于 2012-11-28T14:51:00.150 に答える
1

二分木に再帰的に追加する別の方法は、次のように実行できます。

node *add(node *hd, int v) {
   node* curr = NULL;

   if(!hd){
      curr = malloc(sizeof(node));
      curr->value = v;
      curr->left = NULL;
      curr->right = NULL;
      return curr;
   }
   else {
     if(v < curr->value)
        curr->left = add(curr->left,v);
     else 
        curr->right = add(curr->right,v);  
  }
  return hd;
}
于 2012-11-28T15:03:33.063 に答える
0

私はこのようにしました:

void insert(int data, node *&cur)
{
    if (cur == NULL)
    {
        cur = (struct node*) malloc(sizeof(struct node));
        cur->data = data;
        cur->left = NULL;
        cur->right = NULL;              
    }
    else
    {
        if (data > cur->data)
        {
            insert(data, cur->right);
        }
        else
        {
            insert(data, cur->left);
        }
    }
}
于 2014-03-28T08:34:52.920 に答える
0

新しく形成されたノードの左右のポインターを NULL で初期化し、hd がそのノードを指すようにする必要があります。

void add(node* *hd, int v){
node* curr = *hd;
if(curr == NULL){
    curr = malloc(sizeof(node));
    curr->value = v;
    curr->left=curr->right=NULL;
    *hd = curr;

}else{
    if(v < curr->value){
        add(&curr->left, v);
    }else{
        add(&curr->right, v);
    }
}
}
于 2012-11-28T15:04:06.807 に答える