250 likes | 578 Views
วิชา COSC2202 โครงสร้างข้อมูล (Data Structure). โครงสร้างข้อมูลแบบ Tree (ต่อ). โครงสร้างข้อมูลแบบ Tree. ต้นไม้แบบฮีป (Heap Tree)
E N D
วิชา COSC2202โครงสร้างข้อมูล (Data Structure) โครงสร้างข้อมูลแบบ Tree (ต่อ)
โครงสร้างข้อมูลแบบ Tree • ต้นไม้แบบฮีป (Heap Tree) เป็นการจัดโครงสร้างข้อมูลแบบต้นไม้ไบนารีเกือบสมบูรณ์แบบหนึ่ง โดยที่ต้นไม้ไบนารีเกือบสมบูรณ์แบบนี้ มีข้อกำหนดว่า ค่าที่บรรจุอยู่ภายในโหนดใดๆ ที่เป็นโหนดพ่อจะต้องมีค่าสูงกว่าหรือเท่ากับโหนดลูกทั้งสองของมัน (Max Heap Tree)
ต้นไม้แบบฮีป (Heap Tree) • ตัวอย่างต้นไม้แบบฮีป
ต้นไม้แบบฮีป (Heap Tree) • ตัวอย่าง ที่ไม่ถูกต้อง
ต้นไม้แบบฮีป (Heap Tree) • Reheap Up สลับ Node กับ Parent จนกว่าจะถูกตำแหน่ง
ต้นไม้แบบฮีป (Heap Tree) • Reheap Down สลับ Node กับ Child ที่มีค่ามากกว่า
ต้นไม้แบบฮีป (Heap Tree) • การใส่ข้อมูลเข้าไปในฮีปมีขั้นตอนดังนี้ 1.ใส่ข้อมูลเข้าไปที่โหนดสุดท้ายของฮีป 2. ถ้าข้อมูลที่ใส่เข้าไปนั้นทำให้ได้เป็นต้นไม้ฮีปการใส่ก็เสร็จสิ้น 3. ถ้าต้นไม้ที่ได้ไม่เป็นต้นไม้ฮีป ให้ทำการปรับต้นไม้ที่ได้ให้เป็นฮีป โดยการเปรียบเทียบค่าที่ใส่เข้ามาใหม่กับโหนดพ่อของมัน ถ้าโหนดที่ใส่เข้าไปมีค่ามากกว่าให้สลับที่ ทำเรื่อยๆจนกระทั่งปรับสิ้นสุด
9 8 9 7 5 8 6 7 6 10 ต้นไม้แบบฮีป (Heap Tree) • เติมค่า 10 เข้าไปในต้นไม้ฮีป
10 9 9 9 8 8 10 9 5 10 8 8 10 5 5 5 ต้นไม้แบบฮีป (Heap Tree)
10 9 9 7 8 8 6 7 6 5 ต้นไม้แบบฮีป (Heap Tree) • ฮีปใหม่ที่ได้
ต้นไม้แบบฮีป (Heap Tree) • ลบค่า 10 ออกจากฮีป 10 9 6 7 8 2 5 1 4 3
ต้นไม้แบบฮีป (Heap Tree) 9 9 9 9 8 8 8 8 3 3 3 3
ต้นไม้แบบฮีป (Heap Tree) • ฮีปใหม่ที่ได้ 9 8 6 7 3 2 5 1 4
โครงสร้างข้อมูลแบบ Tree • ต้นไม้เอวีแอล (AVL Tree) เป็นไบนารีเซิร์ซเทรีแบบต้นไม้ไบนารีสมดุล: ถ้า T คือต้นไม้ใดๆ และ N คือโหนดใดๆ บนต้นไม้ T แล้ว ความแตกต่างระหว่างความสูงของต้นไม้ยอ่ย (Sub Tree) ที่อยู่ทางขวา และทางซ้าย ของ N จะถูกเรียกว่า บาลานซ์แฟคเตอร์ (Balance Factor) และต้นไม้ T จะถูกเรียกว่าต้นไม้สมดุล เมื่อบาลานซ์แฟคเตอร์ของ N ใดๆ ต้องมีค่าไม่เกิน |1| (ต้องมีค่าเป็น -1 หรือ 0 หรือ 1)
1 3 2 1 AVL Non-AVL ต้นไม้เอวีแอล (AVL Tree) น้ำหนักความสูงของ node = ความสูง Subtree(ซ้าย) - ความสูง Subtree(ขวา)
ต้นไม้เอวีแอล (AVL Tree) • AVL TREE เมื่อมี Tree ที่ไม่สมดุลจะเกิดการหมุนเพื่อให้สมดุลซึ่งมี 4 วิธี 1. การหมุนซ้าย : โหนดทางขวามากกว่าซ้าย ยกโหนดที่อยู่ขวาขึ้นมา 2. การหมุนขวา : โหนดทางซ้ายมากกว่าขวา ยกโหนดที่อยู่ซ้ายขึ้นมา 3. การหมุนขวาไปซ้าย : หมุนขวาก่อน แล้วค่อยหมุนซ้าย 4. การหมุนซ้ายไปขวา : หมุนซ้ายก่อน แล้วค่อยหมุนขวา
ต้นไม้เอวีแอล (AVL Tree) - การหมุนซ้าย • การหมุนซ้าย 0 -2 7 5 0 0 -1 5 8 7 0 ไม่สมดุล 8 สมดุล
ต้นไม้เอวีแอล (AVL Tree) - การหมุนขวา • การหมุนขวา
ต้นไม้เอวีแอล (AVL Tree) - การหมุนขวาไปซ้าย หมุนซ้ายครั้งที่ 2 หมุนขวาครั้งแรก
ต้นไม้เอวีแอล (AVL Tree) - การหมุนซ้ายไปขวา หมุนขวาครั้งที่ 2 หมุนซ้ายครั้งแรก
การใส่โหนดใหม่เข้าไปใน AVL Tree • ถ้า node เข้าไปใหม่ทำให้ Tree เสียสมดุล ทำให้สมดุลได้โดยการหมุน • ตัวอย่าง ใส่ node 5,7,10,15,19,20
การใส่โหนดใหม่เข้าไปใน AVL Tree • ใส่ node 5,7,10,15,19,20
การใส่โหนดใหม่เข้าไปใน AVL Tree • ใส่ node 5,7,10,15,19,20
การลบ node ใน AVL TREE • ถ้าลบโหนดออกไปแล้วเกิดเสียสมดุล ก็ทำให้ต้นไม้สมดุล โดยการหมุน เมื่อลบ node 4 เมื่อลบ node 2
การลบ node ใน AVL TREE • เมื่อไม่สมดุล ก็หมุนให้สมดุล จะได้เป็น