Traversal pohon preorder berfungsi tetapi postorder tidak

Saya memiliki dua fungsi yang melintasi pohon di preorder dan postorder, masing-masing memasukkan nilai dalam node ke dalam array, dan mengembalikan array.

Namun, fungsi postorder saya tidak berfungsi. Saya mendapatkan kesalahan segmentasi saat fungsi tersebut dipanggil.

Ketika kode berikut dikompilasi dan dijalankan, tetapi setelah memanggil metode postorder saya mendapatkan kesalahan segmentasi.

Ini kode saya:

int* preorder_recursive(node *root, int* dataArray)
{

  if (root == NULL)
    return dataArray;

  for (int i = 0; i < 512; i++)
  {
    if (dataArray[i] == INT_MIN)
    {
      dataArray[i] = root->data;
      printf("%d is being inserted to the preorder array at pos %d\n", root->data, i);
      break;
    }
  }

  preorder_recursive(root->left, dataArray);
  preorder_recursive(root->right, dataArray);
}

int* postorder_recursive(node *root, int *dataArray)
{
  if (root == NULL)
    return dataArray;

  postorder_recursive(root->left, dataArray);

  postorder_recursive(root->right, dataArray);

  for (int i = 0; i < 512; i++)
  {
    // any "empty" spots in the array should contain INT_MIN
    if (dataArray[i] == INT_MIN)
    {
      dataArray[i] = root->data;
      printf("%d is being inserted to the postorder array at pos %d\n", root->data, i);
      break;
    }
  }
}

Saat menelepon:

int * complete_pre_b = preorder_recursive(b, pre_order_b);
for(int i = 0; i < 3; i++)
{
    printf("pre b is %d\n", complete_pre_b[i]);
}

int * complete_post_b = postorder_recursive(b, post_order_b);
// here is the last print I see - code get till here fine
for(int i = 0; i < 3; i++)
{
    printf("post b is %d\n", complete_post_b[i]);
}

(Perhatikan - Saya memiliki pohon dengan 3 simpul, itulah sebabnya saya mengulang i dari 0 hingga 3)

Apa masalahnya? Apa perbedaan antara postingan saya dan pre order?


person Uclydde    schedule 11.11.2018    source sumber
comment
Tampaknya baik-baik saja dari perspektif algoritmik. Menurut saya, ini saat yang tepat untuk memberikan contoh yang minimal, lengkap, dan singkat. . .   -  person gsamaras    schedule 11.11.2018
comment
Bisakah Anda memposting use case yang gagal dan yang utama? (membuat dataArray dan penggunaan fungsi) Apakah kesalahan segmentasi terjadi di awal atau di tengah fungsi? apakah kamu mendapat sidik jari sama sekali?   -  person dWinder    schedule 11.11.2018
comment
Saya telah mengedit postingan untuk memasukkan semua kode saya @DavidWinder   -  person Uclydde    schedule 11.11.2018
comment
@gsamaras Saya telah mengedit postingan tersebut.   -  person Uclydde    schedule 12.11.2018
comment
Dan itulah mengapa Anda mendapatkan jawaban, pertanyaan yang bagus dan bagus sekarang!   -  person gsamaras    schedule 12.11.2018


Jawaban (1)


Perhatikan yang Anda lakukan: complete_post_b = postorder_recursive(b, post_order_b); ketika complete_post_b didefinisikan di awal main sebagai: int* complete_post_b;

Namun, di postorder_recursive Anda tidak mengembalikan data apa pun. jadi ketika ditugaskan ke complete_post_b sebenarnya batal.

Perulangan for Anda harus seperti:

for(int i = 0; i < 3; i++)
{
   printf("post b is %d\n", post_order_b[i]); // and not complete_post_b 
}

Atau Anda dapat mengembalikan dataArray dan menggunakan complete_post_b.

Yang menarik: mengapa ini hanya terjadi di postOrder?

Perhatikan, satu-satunya saat Anda mengembalikan dataArray adalah ketika simpulnya nol. Dugaan saya adalah dalam hal ini, register untuk nilai pengembalian akan berisi array data. Saat memanggil fungsi rekursif di akhir fungsi Anda, alamat array data tetap di register dan ditransfer ke depan - tetapi Anda tidak dapat mengandalkannya dan Anda harus benar-benar mengembalikan alamat tersebut jika Anda ingin menggunakannya

person dWinder    schedule 11.11.2018
comment
Bagaimana cara mengubah kode saya untuk mengembalikan alamat, tanpa merusak semuanya? - person Uclydde; 12.11.2018
comment
@Uclydde Anda cukup menambahkan return dataArray di akhir fungsi - tapi saya yakin lebih baik memodifikasi fungsi menjadi batal dan menggunakan array asli di main - person dWinder; 12.11.2018
comment
Menambahkan pernyataan return berhasil! Terima kasih banyak! - person Uclydde; 12.11.2018