การสั่งเปลี่ยนเส้นทางต้นไม้ล่วงหน้าใช้งานได้ แต่การสั่งจองภายหลังไม่ได้ผล

ฉันมีสองฟังก์ชันที่สำรวจแผนผังใน preorder และ postorder โดยแต่ละฟังก์ชันจะแทรกค่าในโหนดลงในอาร์เรย์ และส่งคืนอาร์เรย์

อย่างไรก็ตาม ฟังก์ชัน postorder ของฉันไม่ทำงาน ฉันได้รับข้อผิดพลาดในการแบ่งส่วนเมื่อมีการเรียกใช้ฟังก์ชัน

เมื่อคอมไพล์และรันโค้ดต่อไปนี้ แต่หลังจากเรียกใช้เมธอด postorder ฉันได้รับข้อผิดพลาดในการแบ่งเซ็กเมนต์

นี่คือรหัสของฉัน:

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;
    }
  }
}

เมื่อโทร:

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]);
}

(ประกาศ - ฉันมีต้นไม้ที่มี 3 โหนดว่าทำไมฉันถึงวนซ้ำ i จาก 0 ถึง 3)

มีปัญหาอะไรบ้าง? โพสต์ของฉันและการสั่งซื้อล่วงหน้าแตกต่างกันอย่างไร?


person Uclydde    schedule 11.11.2018    source แหล่งที่มา
comment
มันดูดีจากมุมมองของอัลกอริธึม ฉันคิดว่าถึงเวลาแล้วสำหรับตัวอย่างที่น้อยที่สุด สมบูรณ์ และกระชับ . .   -  person gsamaras    schedule 11.11.2018
comment
คุณช่วยกรุณาโพสต์กรณีการใช้งานที่ล้มเหลวและหลักได้ไหม (การสร้าง dataArray และการใช้งานฟังก์ชัน) ข้อผิดพลาดในการแบ่งส่วนเกิดขึ้นที่จุดเริ่มต้นของฟังก์ชันหรือตรงกลางหรือไม่? คุณได้รับรูปพิมพ์บ้างไหม?   -  person dWinder    schedule 11.11.2018
comment
ฉันได้แก้ไขโพสต์เพื่อรวมโค้ดทั้งหมดของฉัน @DavidWinder   -  person Uclydde    schedule 11.11.2018
comment
@gsamaras ฉันได้แก้ไขโพสต์ตามนั้น   -  person Uclydde    schedule 12.11.2018
comment
และนั่นคือเหตุผลว่าทำไมคุณถึงได้รับคำตอบ เป็นคำถามที่ดีและดีในตอนนี้!   -  person gsamaras    schedule 12.11.2018


คำตอบ (1)


โปรดสังเกตว่าคุณทำ: complete_post_b = postorder_recursive(b, post_order_b); เมื่อ complete_post_b ถูกกำหนดไว้ที่จุดเริ่มต้นของ main เป็น: int* complete_post_b;

อย่างไรก็ตาม ที่ postorder_recursive คุณไม่ส่งคืนข้อมูลใดๆ ดังนั้นเมื่อกำหนดให้ complete_post_b ถือเป็นโมฆะจริงๆ

for loop ของคุณควรเป็น:

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

หรือคุณสามารถส่งคืน dataArray และใช้ complete_post_b

ในส่วนที่สนใจ: เหตุใดจึงเกิดขึ้นเฉพาะใน postOrder เท่านั้น

โปรดสังเกตว่า ครั้งเดียวที่คุณส่งคืน dataArray คือเมื่อโหนดเป็นโมฆะ ฉันเดาว่าในกรณีนั้นการลงทะเบียนสำหรับค่าส่งคืนจะมีอาร์เรย์ข้อมูล เมื่อมีการเรียกใช้ฟังก์ชันแบบเรียกซ้ำที่ส่วนท้ายของฟังก์ชันของคุณ ที่อยู่ของอาร์เรย์ข้อมูลจะยังคงอยู่ในรีจิสเตอร์และถ่ายโอนไปข้างหน้า - แต่คุณไม่สามารถวางใจได้และคุณต้องส่งคืนที่อยู่จริงหากคุณต้องการใช้

person dWinder    schedule 11.11.2018
comment
ฉันจะแก้ไขโค้ดเพื่อส่งคืนที่อยู่โดยไม่ทำให้ทุกอย่างเสียหายได้อย่างไร - person Uclydde; 12.11.2018
comment
@Uclydde คุณสามารถเพิ่ม return dataArray ที่ส่วนท้ายของฟังก์ชัน - แต่ฉันเชื่อว่าดีกว่าคือการปรับเปลี่ยนฟังก์ชันให้เป็นโมฆะและใช้อาร์เรย์ดั้งเดิมในส่วนหลัก - person dWinder; 12.11.2018
comment
การเพิ่มคำสั่ง return เป็นการหลอกลวง! ขอบคุณมาก! - person Uclydde; 12.11.2018