School of Information Communication Technology, Chapter 5 Tree Part 2 WATTANAPONG SUTTAPAK Software Engineering, School of Information Communication Technology, University of PHAYAO
จุดประสงค์ บทเรียนที่ 5 มีความรู้ความเข้าใจเรื่องการท่องไบนารี่ทรีทั้ง 3 แบบ สามารถเขียนโปรแกรมเพิ่ม ลบ ค้นหา และแสดงผลไบนารี่ทรีได้ มีความรู้ความเข้าใจในเรื่องเอวีแอลทรีได้ มีความรู้ความเข้าใจในเรื่องการปรับโหนดของเอวีแอลทรี สามารถเพิ่ม ลบ ค้นหา และแสดงผลเอวีแอลทรีได้
TREE TRAVERSAL
Tree Traversal Tree traversal ชื่อภาษาไทย การท่องโหนด แบ่งเป็น 3 ประเภทคือ inorder preorder postorder โดยแต่ละประเภทมีลักษณะดังต่อไปนี้
Tree Traversal inorder เป็นการเข้าเข้าถึงโหนดแบบ ascending order นั่นคือเข้าตามลำดับจากน้อยไปหามาก หรือตามลำดับก่อนหลัง(เช่นตัวอักษรก่อนไปหลัง) การเข้าถึงโหนดวิธีนี้มีลำดับการเข้าถึงตามลำดับความสำคัญคือ โหนดซ้าย โหนดพ่อแม่ โหนดขวา ประโยชน์ของการท่องโหนดแบบ inorder เช่น การเรียงลำดับข้อมูล การหาค่ามากสุด น้อยสุด ค่ากลาง เป็นต้น
Tree Traversal inorder step 1. start at root node ,set root to c-node 2. check c-node has L-child? 2.1 Y : change L-child to c-node then go to 2 2.2 N : print c-node check c-node has R-child? 2.2.1 Y: set R-child to c-node then go to 2. 2.2.2 N: return;
Tree Traversal inorder Ex1 6 4 8 2 5 7 11 1 3 1 2 3 4 5 6 7 8 11
Tree Traversal จะเห็นว่า inorder เราจะสามารถตอบได้ทันที inorder Ex2 จะเห็นว่า inorder เราจะสามารถตอบได้ทันที นั่นคือลำดับน้อยไปหามาก แต่ในการใช้งานจริง (coding) จะไม่เห็นตัวเลข ดังนั้นจึงต้องใช้ อัลกอริทึมดังที่กล่าวมา 6 4 9 5 8 11 7 13 4 5 6 7 8 9 11 13
Tree Traversal กรณีข้อมูลเป็นคลาส และมีการลำดับ attribute s1 s2 s3 s5 inorder Ex3 สมมติ s เป็น class student เก็บ id, name เรียงลำดับ id s1 s2 s3 s5 s4 s8 s6 s7 s2 s5 s1 s6 s4 s3 s8 s7
Tree Traversal preorder เป็นการเข้าถึงโหนด โดยจุดประสงค์ในการเข้าถึงยังไม่แน่ชัดแตกต่างจาก inorder ที่มีจุดประสงค์ชัดเจน โดยการเข้าถึงโหนดวิธีนี้มีลำดับการเข้าถึงตามลำดับความสำคัญคือ โหนดพ่อแม่ โหนดซ้าย โหนดขวา ตัวอย่างการประยุกต์ใช้ ได้แก่ การแปลงเป็น prefix
Tree Traversal preorder step start at root node , set root to c-node print c-node check c-node has L-child? 3.1 Y : change L-child to c-node then go to 2 3.2 N : check c-node has R-child? 3.2.1 Y: set R-child to c-node then go to 2. 3.2.2 N: return;
Tree Traversal จะสังเกตุเห็นว่าเมื่อนำข้อมูล ที่ได้จาก preorder ไป insert จะได้ลักษณะตาม tree preorder Ex1 6 4 8 2 7 11 5 1 3 6 4 2 1 3 5 8 7 11
Tree Traversal * / + 7 1 4 3 * / + 1 3 4 + 7 1 preorder Ex2 ((1+3)/4)*(7+1) * / + 7 1 4 3 * / + 1 3 4 + 7 1
Tree Traversal postorder เป็นการเข้าถึงโหนด ที่จุดประสงค์ไม่ชัดเจนเช่นกัน(เหมือน preorder) โดยการเข้าถึงโหนดวิธีนี้มีลำดับการเข้าถึงตามลำดับความสำคัญคือ โหนดซ้าย โหนดขวา โหนดพ่อแม่ ตัวอย่างการประยุกต์ใช้ ได้แก่ การแปลงเป็น postfix
Tree Traversal postorder step start at root node , set root to c-node check c-node has L-child? 3.1 Y : change L-child to c-node then go to 2 3.2 N : check c-node has R-child? 3.2.1 Y: set R-child to c-node then go to 2. 3.2.2 N: print L-child , return;
Tree Traversal จะสังเกตุเห็นว่าเมื่อนำข้อมูล ที่ได้จาก postorder (จากหลังไปหน้า) นำไป insert จะได้ลักษณะตาม tree postorder Ex1 6 4 8 2 7 11 5 1 3 1 3 2 5 4 7 11 8 6
Tree Traversal * / + 7 1 4 3 1 3 + 4 / 7 1 + * postorder Ex2 ((1+3)/4)*(7+1) * / + 7 1 4 3 1 3 + 4 / 7 1 + *
DELETION NODE
Deletion node กระบวนการลบโหนด มีความซับซ้อนกว่าการเพิ่ม การอ่านและการค้นหา เนื่องจากเมื่อลบแล้ว ต้องพิจารณาโหนดที่มาแทนที่โหนดที่ลบ ขั้นตอนการลบโหนด ถ้าโหนดที่ลบไม่มี leaf node ไม่ต้องหาโหนดมาแทน ถ้าโหนดที่ลบมีเพียง 1 leaf node ให้นำ leaf node นั้นมาแทนที่ได้เลย ถ้าโหนดที่ลบมี 2 leaf node ให้แทนที่ด้วยโหนดด้านซ้ายที่มีค่ามากที่สุดหรือโหนดด้านขวาที่มีค่าน้อยที่สุด
Deletion node deletion node Ex1 ลบ โหนด 5 6 4 8 2 5 7 11 1 3
Deletion node deletion node Ex2 ลบ โหนด 11 6 4 8 2 5 7 11 1 3 14 13 15
Deletion node deletion node Ex2 ลบ โหนด 11 6 4 8 2 5 7 14 1 3 13 15
Deletion node deletion node Ex3 ลบ โหนด 4 6 4 8 2 7 11 5 1 3
Deletion node deletion node Ex3 ลบ โหนด 4 วิธีที่ 1 6 3 8 2 5 7 11 1
Deletion node deletion node Ex3 ลบ โหนด 4 วิธีที่ 2 6 4 8 2 7 11 5 1 3
Deletion node deletion node Ex3 ลบ โหนด 4 วิธีที่ 2 6 5 8 2 7 11 1 3
AVL TREE
AVL Tree 3 6 5 5 6 3 เป็น tree (Adel’son-Vel’ski and Landis) พัฒนาความสามารถของ binary search tree(b-s-tree ) รูปแบบโหนดขึ้นกับการลำดับการเพิ่มข้อมูล ทำให้จำนวนโหนดมีโอกาสจัดเรียงเป็น L-node ทั้งหมดหรือ R-node ทั้งหมด ทำให้การค้นหาเกิดเป็น worst case(O(n)) เช่น 6 5 3 6 5 3
AVL Tree 6 5 8 1 6 5 8 9 1 2 6 5 3 1 2 โดยต้องมีคุณสมบัติดังต่อไปนี้ เป็น binary search tree มีเงื่อนไขสมดุล(balance) ของ tree นั่นคือ P-node มี level ของ L-child และ R-child มีความแตกต่างไม่เกิน 1 6 5 8 1 6 5 8 9 1 2 6 5 3 1 2
AVL Tree 44 17 62 50 78 1 32 48 54 64 88 35 46 49 51 56 81 91 h = 1 h = 2 h = 3 h = 4
AVL Tree 6 5 8 3 9 6 4 8 3 9 5 7 6 4 8 3 9 5 11 โหนด 8 ความสูงต่างกัน 0 กับ 2
AVL Tree 6 5 8 2 1 Insertion Ex1 ต้องการเพิ่ม 6 5 8 2 1 3 ทำการเพิ่มข้อมูลเหมือน binary search tree 6 5 8 2 1
AVL Tree 6 5 8 2 1 1 สมดุลแต่ผิดกฏของ balance search tree ดังนั้นจึงต้อง rebalance tree ด้วยวิธีการหมุน
AVL Tree Rotation เป็นการปรับสมดุลของ AVL Tree แบ่งเป็น 2 วิธีคือ 1. หมุนครั้งเดียว 2. หมุนสองครั้ง
a b single rotation b a c c b c single rotation a c b a
AVL Tree 6 5 8 2 1
AVL Tree 6 8 5 2 1
AVL Tree 6 8 2 1 5
AVL Tree 6 8 2 1 5
b c a a c b double rotation a b c c b a c a b double rotation a b c
4 rotations
a b T0 T1 T2 T3 single rotation b a c c T0 T1 T2 T3
a b c T0 T1 T2 T3 b single rotation a c T0 T1 T2 T3
a b c T0 T1 T2 T3 a c b T0 T3 T1 T2 double rotation a b c T0 T1 T2 T3
a b c T0 T1 T2 T3 a c b T0 T3 T1 T2 double rotation a b c T0 T1 T2 T3
AVL Tree Exercise เพิ่มโหนดใน AVL Tree ของค่าต่อไปนี้ 1 22 10 9 8 5 4 15 6 7 3 ลบโหนดต่อไปนี้จาก AVL Tree ด้านบน 7 9 15
AVL Tree 1 22 10 double rotation 1 22 10 9 8 5 4 15 6 7 3
AVL Tree 10 22 1 9 8 double rotation 1 22 10 9 8 5 4 15 6 7 3
AVL Tree 10 8 22 1 9 5 a b c single rotation 1 22 10 9 8 5 4 15 6 7 3
AVL Tree 8 1 10 5 9 22 4 1 22 10 9 8 5 4 15 6 7 3
AVL Tree 8 4 10 1 5 9 22 1 22 10 9 8 5 4 15 6 7 3
AVL Tree 8 4 10 1 5 9 22 6 15 7 1 22 10 9 8 5 4 15 6 7 3
AVL Tree 8 4 10 1 6 9 22 3 5 7 15 1 22 10 9 8 5 4 15 6 7 3
AVL Tree Ex 2 8 4 10 1 6 9 22 3 5 7 15 ลบโหนด 7 9 15
AVL Tree Ex 2 8 4 15 1 6 10 22 3 5 ลบโหนด 7 9 15
AVL Tree Ex 2 8 4 10 1 6 22 3 5 ลบโหนด 7 9 15
AVL Tree Ex 2 8 4 22 1 6 10 3 5 ลบโหนด 7 9 15
AVL Tree Ex 3 4 44 2 3 17 62 1 2 2 1 50 1 78 1 18 1 48 54 64 88 19 46 49 51 56 81 91
AVL Tree Ex 3 44 1 3 T0 17 62 2 2 T1 1 50 1 78 1 18 1 48 54 T2 64 T3 88 46 49 51 56 81 91
AVL Tree 44 62 78 T0 T1 T2 T3 44 62 78 T0 T1 T2 T3 reconstruction
AVL Tree 44 17 62 1 50 78 18 48 46 49 54 51 56 64 88 81 91 T0 T1 T2 T3 T0 T1 T2 T3 ?
4 rotation types
4 rotation types b=y a=z a=z b=y c=x single rotation c=x a b c เรียงตามลำดับซ้ายไปขวา หรือ a<b<c x y z เรียงตามลำดับบนลงล่าง
4 rotation types c=z b=y b=y a=x c=z single rotation a=x a b c เรียงตามลำดับซ้ายไปขวา หรือ a<b<c x y z เรียงตามลำดับบนลงล่าง
4 rotation types a=z b=x c=y a=z c=y double rotation b=x a b c เรียงตามลำดับซ้ายไปขวา หรือ a<b<c x y z เรียงตามลำดับบนลงล่าง
4 rotation types b=x c=z a=y a=y c=z double rotation b=x a b c เรียงตามลำดับซ้ายไปขวา หรือ a<b<c x y z เรียงตามลำดับบนลงล่าง
อัลกอริทึมการเพิ่ม ลบ โหนด เพื่อปรับโครงสร้าง set add or delete node to c-node c-node is root then exit c-node is balance ? 3.1 c-node is balance 3.1.1 set parent node of c-node to c-node 3.1.2 go to 2 3.2 c-node is not balance 3.2.1 set c-node to z node 3.2.2 set y to longest node : child L or R of z node (equal set R) 3.2.3 set x to longest node : child L or R of y node (equal set R) 3.2.4 check 4 reconstruction similar with a,b,c and x,y,z
AVL Tree z 44 y 1 3 T0 17 62 x 2 2 T1 1 50 78 1 18 1 1 48 54 T2 64 T3 88 46 49 51 56 81 91
AVL Tree y 44 17 62 1 50 78 18 48 46 49 54 51 56 64 88 81 91 T0 T1 T2 T3 z x
Another Tree splay tree 2-4 tree or 2-3-4 tree Red Black tree