เมื่อใดควรใช้กลยุทธ์การสั่งซื้อล่วงหน้าในการสั่งซื้อและหลังการสั่งซื้อ
ก่อนที่คุณจะเข้าใจได้ว่าจะใช้การสั่งซื้อล่วงหน้าตามลำดับและหลังการสั่งซื้อสำหรับต้นไม้ไบนารีภายใต้สถานการณ์ใดคุณต้องเข้าใจว่ากลยุทธ์การข้ามผ่านแต่ละแบบทำงานอย่างไร ใช้ต้นไม้ต่อไปนี้เป็นตัวอย่าง
รากของต้นไม้คือ7ซ้ายโหนดที่สุดคือ0 , โหนดที่เหมาะสมที่สุดคือ10
การสั่งซื้อล่วงหน้า :
สรุป: เริ่มต้นที่รูท ( 7 ) สิ้นสุดที่โหนดขวาสุด ( 10 )
ลำดับการข้ามผ่าน: 7, 1, 0, 3, 2, 5, 4, 6, 9, 8, 10
การส่งผ่านตามลำดับ :
สรุป: เริ่มต้นที่โหนดซ้ายสุด ( 0 ) สิ้นสุดที่โหนดขวาสุด ( 10 )
ลำดับการส่งผ่าน: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
การส่งผ่านภายหลังการสั่งซื้อ :
สรุป: เริ่มต้นด้วยโหนดซ้ายสุด ( 0 ) ลงท้ายด้วยรูท ( 7 )
ลำดับการข้ามผ่าน: 0, 2, 4, 6, 5, 3, 1, 8, 10, 9, 7
ควรใช้ Pre-Order, In-order หรือ Post-Order เมื่อใด
กลยุทธ์การข้ามผ่านที่โปรแกรมเมอร์เลือกขึ้นอยู่กับความต้องการเฉพาะของอัลกอริทึมที่ออกแบบ เป้าหมายคือความเร็วดังนั้นเลือกกลยุทธ์ที่นำคุณไปสู่โหนดที่คุณต้องการเร็วที่สุด
หากคุณรู้ว่าคุณต้องสำรวจรากก่อนที่จะตรวจสอบใบใด ๆ คุณเลือกสั่งซื้อล่วงหน้าเพราะคุณจะพบรากทั้งหมดก่อนใบทั้งหมด
หากคุณรู้ว่าคุณจำเป็นต้องสำรวจใบไม้ทั้งหมดก่อนโหนดใด ๆ คุณเลือกโพสต์ออร์เดอร์เพราะคุณไม่ต้องเสียเวลาตรวจสอบรากเพื่อค้นหาใบไม้
ถ้าคุณรู้ว่าทรีมีลำดับโดยธรรมชาติในโหนดและคุณต้องการทำให้ต้นไม้แบนกลับเป็นลำดับเดิมควรใช้การข้ามตามลำดับ ต้นไม้จะแบนราบในลักษณะเดียวกับที่สร้างขึ้น การสั่งซื้อล่วงหน้าหรือการสั่งซื้อภายหลังการส่งผ่านอาจไม่คลายต้นไม้กลับเข้าสู่ลำดับที่ใช้ในการสร้าง
อัลกอริธึมแบบเรียกซ้ำสำหรับการสั่งซื้อล่วงหน้าตามลำดับและหลังการสั่งซื้อ (C ++):
struct Node{
int data;
Node *left, *right;
};
void preOrderPrint(Node *root)
{
print(root->name); //record root
if (root->left != NULL) preOrderPrint(root->left); //traverse left if exists
if (root->right != NULL) preOrderPrint(root->right);//traverse right if exists
}
void inOrderPrint(Node *root)
{
if (root.left != NULL) inOrderPrint(root->left); //traverse left if exists
print(root->name); //record root
if (root.right != NULL) inOrderPrint(root->right); //traverse right if exists
}
void postOrderPrint(Node *root)
{
if (root->left != NULL) postOrderPrint(root->left); //traverse left if exists
if (root->right != NULL) postOrderPrint(root->right);//traverse right if exists
print(root->name); //record root
}