ดังนั้นก่อนที่คุณจะอ่านแนวคิดวิทยาศาสตร์คอมพิวเตอร์ขั้นพื้นฐาน
- ต้นไม้ไบนารีเป็นโครงสร้างที่จัดสรรแบบไดนามิก (มักจะใช้สำหรับการจัดเก็บข้อมูลที่สั่งซื้อ)
- เพราะธรรมชาติของมันผ่านต้นไม้ไบนารีมักจะเรียกซ้ำ;
นี่เป็นเพราะการเคลื่อนที่แบบเชิงเส้น (ผ่านลูป) นั้นไม่เป็นธรรมชาติเมื่อมีการวนลูปสองทาง- วนซ้ำ: นี่หมายถึงฟังก์ชั่นที่เรียกตัวเองว่า
- ในภาษาที่ล้าสมัยการจัดการหน่วยความจำจำเป็นต้องมีการจัดการหน่วยความจำด้วยตนเอง
- คู่มือ: หมายความว่าคุณต้องทำด้วยตัวเอง
- เมื่อคุณทำการจัดการหน่วยความจำแบบแมนนวลคุณจะต้องขอให้ระบบที่อยู่ภายใต้นั้นว่างให้กับสมาชิกของแผนผังแต่ละตัว
- ฟรี: กู้คืนหน่วยความจำไปยัง poos ทั่วโลกเพื่อให้สามารถนำมาใช้ใหม่และคุณไม่ได้ใช้หน่วยความจำไม่เพียงพอ
- การทำให้พ้น: สิ่งนี้ทำได้โดยการเรียกใช้ฟังก์ชัน
free()
และส่งต่อตัวชี้ที่คุณต้องการกู้คืน - ตัวชี้: มันเหมือนแท่งเสมือนจริง ในตอนท้ายของหน่วยความจำคือ เมื่อคุณขอหน่วยความจำคุณจะได้รับพอยน์เตอร์ (แท่งเสมือน) ที่มีหน่วยความจำ เมื่อคุณทำเสร็จแล้วให้คืนพอยน์เตอร์ (แท่งเสมือน)
โซลูชันแบบเรียกซ้ำ:
freeTree(Node* node)
{
freeTree(node->left);
freeTree(node->right);
free(node);
}
ปัญหาคือการเรียกซ้ำหมายความว่าคุณกำลังเรียกฟังก์ชันเดียวกันซ้ำ ๆ สิ่งนี้จะเพิ่มจำนวนสแต็ก การขยายสแต็กใช้หน่วยความจำมากขึ้น เหตุผลที่คุณทำให้ต้นไม้ว่างอยู่เพราะคุณต้องการให้หน่วยความจำกลับมาใช้หน่วยความจำมากขึ้นก็เป็นสิ่งที่ตรงกันข้าม (แม้ว่าคุณจะได้รับหน่วยความจำทั้งสองกลับมา)
ในที่สุดคำถาม:
ดังนั้นศูนย์จะมีปัญหาเกี่ยวกับการแปลงเวอร์ชั่นซ้ำข้างต้นเป็นโซลูชันเชิงเส้น (เพื่อให้คุณไม่ต้องใช้หน่วยความจำ)
กำหนดประเภทโหนด
typedef struct Node Node;
struct Node
{
Node* left;
Node* right;
};
เขียนฟังก์ชันเพื่อทำให้แผนผังของโหนดเหล่านี้ว่าง
ข้อ จำกัด:
- ไม่สามารถใช้การเรียกซ้ำ (ไม่แม้แต่ทางอ้อม)
ไม่สามารถจัดสรรพื้นที่ไดนามิกใด ๆ สำหรับการติดตาม
โปรดทราบว่ามีวิธีแก้ปัญหา O (n)
ผู้ชนะ:
- ความซับซ้อนที่ดีที่สุด
- Tie Break 1: Submitted ครั้งแรก
- Tie Break 2: จำนวนตัวอักษรน้อยที่สุด