Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

2-3 Trees โครงสร้างข้อมูลและอัลกอริทึมใน C++


2-3 Tree เป็นต้นไม้ในโครงสร้างข้อมูลที่โหนดทุกตัวเป็น 2-node หรือ 3-node เป็นกรณีพิเศษของ B-Tree ออร์เดอร์ 3

  • 2-node: มี 1 ส่วนข้อมูล (data) และ 2 ลูก
  • 3-node: มี 2 ส่วนข้อมูล และ 3 ลูก

2-3 Trees โครงสร้างข้อมูลและอัลกอริทึมใน C++

คุณสมบัติของ 2-3 Tree

  • โหนดภายในทุกตัวเป็น 2-node หรือ 3-node
  • โหนดที่มี 1 data → 2-node มี 2 ลูก หรือเป็น leaf ไม่มีลูก
  • โหนดที่มี 2 data → 3-node มี 3 ลูกเท่านั้น
  • Leaf ทุกตัวอยู่ระดับเดียวกัน
  • 2-3 Tree เป็น height-balled tree เสมอ
  • ค้นหา (Search) รวดเร็วและมีประสิทธิภาพ

2-Node

  • มีลูก 2 ตัว
  • ลูกซ้ายมีค่าน้อยกว่า
  • ลูกขวามีค่ามากกว่า
  • อาจเป็น leaf ไม่มีลูก

2-3 Trees โครงสร้างข้อมูลและอัลกอริทึมใน C++

3-Node

  • มีลูก 3 ตัว
  • มีค่าข้อมูล 2 ค่า
  • ลูกซ้าย < data ซ้าย, ลูกกลางอยู่ระหว่าง 2 data, ลูกขวา > data ขวา
  • ไม่เคยเป็น leaf

2-3 Trees โครงสร้างข้อมูลและอัลกอริทึมใน C++

การดำเนินการใน 2-3 Tree

1. การค้นหา (Searching)

  • คล้าย Binary Search Tree เพราะข้อมูลเรียงลำดับ
  • ถ้าต้นไม้ว่าง → False
  • ถ้าถึงรากแล้วไม่เจอ → False
  • X < data ซ้าย → ค้นหา subtree ซ้าย
  • data ซ้าย < X < data ขวา → ค้นหา subtree กลาง
  • X > data ขวา → ค้นหา subtree ขวา

2-3 Trees โครงสร้างข้อมูลและอัลกอริทึมใน C++

2. การแทรก (Insertion)

  • ถ้าต้นไม้ว่าง → ใส่ X เป็นราก
  • ค้นหาตำแหน่งที่ถูกต้อง ใส่เป็น leaf
  • ถ้า leaf มี 1 data → ใส่ X กลายเป็น 2-node
  • ถ้า leaf มี 2 data → ใส่ X แยก 3-node ชั่วคราว ย้าย data ขึ้นไปพาเรนต์ตามลำดับ

ตัวอย่างสร้าง 2-3 tree ใส่: 10, 5, 8, 15, 23, 21

2-3 Trees โครงสร้างข้อมูลและอัลกอริทึมใน C++

3. การลบ (Deletion)

  • ถ้าต้นไม้ว่าง → False
  • ค้นหาตำแหน่ง X ลบ แล้วปรับโครงสร้าง
  • ถ้า X อยู่ใน 3-node → ลบ X ปรับค่าซ้าย/กลาง รวมถึง ancestor ถ้าจำเป็น
  • ถ้า X อยู่ใน 2-node → ปรับและแยกต้นไม้แบบ recursive เรียงลำดับใหม่