ต้นไม้ Tree (2) ผู้สอน อาจารย์ ยืนยง กันทะเนตร สาขาวิชาเทคโนโลยีคอมพิวเตอร์เคลื่อนที่ คณะเทคโนโลยีสารสนเทศและการสื่อสาร Website : ict.up.ac.th/yeunyong
หัวข้อวันนี้ Binary Search Tree (BST) การเพิ่ม , ลบโหนดออกจาก BST AVL Tree การเพิ่ม , ลบโหนดออกจาก AVL Tree Balancing Tree (หลักการทำต้นไม้ให้สมดุล) SLR (single left rotation), SRR (single right rotation), DLR (double left rotation), DRR (double right rotation)
binary search tree เป็น binary tree ที่มีคุณสมบัติพิเศษ คือ ทุก node ของ subtree ทางซ้ายมีค่าน้อยกว่า root ทุก node ของ subtree ทางขวามีค่ามากกว่าหรือเท่ากับ root ทุก ๆ subtree เป็น binary search tree >
ตัวอย่าง Binary Search Tree ที่ถูกต้อง
ตัวอย่าง Binary Search Tree ที่ไม่ถูกต้อง
ประโยชน์ของ Binary Search Tree ต้องการค้นหาข้อมูล 1 ตัวจากข้อมูลทั้งหมด100,000 ตัว เก็บในอาร์เรย์ : อาจต้องค้นหา 100,000 ครั้ง ค้นหาในอาร์เรย์ทีละช่อง เก็บใน BST : ลดจำนวนการค้นหาลงได้สูงสุดเหลือเพียง 17 ครั้ง(โดยประมาณ) ถ้า root แบ่งข้อมูลเป็น 2 ส่วนเท่าๆกัน ค้นครั้งที่ 1 เหลือข้อมูล ½ ค้นครั้งที่ 2 เหลือข้อมูล ¼ ...
สิ่งที่ควรทราบเพิ่มเติมเกี่ยวกับ binary search tree ถ้าเป็น BST ที่ลูกทางด้านซ้ายมีค่าน้อยกว่าพ่อแม่ เราสามารถใช้ inorder traversal เพื่อหาข้อมูลที่เรียงลำดับกันได้ ถ้าต้องการหาข้อมูลที่มีค่าน้อยที่สุด สามารถหาได้ leaf ที่อยู่ทางด้านซ้ายสุดของทรี หรือจะเท่ากับ root ของ subtree ทางด้านซ้ายสุด ถ้ากรณี subtree นั้นไม่มีโหนดลูกทางด้านซ้าย ในทำนองเดียวกัน เราก็สามารถหาข้อมูลที่มีค่ามากที่สุดได้เช่นเดียวกัน
Binary Tree Traversal 7, 1, 0, 3, 2, 5, 4, 6, 9, 8, 10 root => PreOder 1. Visit the root 2. Traverse the left subtree 3. Traverse the right subtree InOder 1. Traverse the left subtree 2. Visit the root PostOder 2. Traverse the right subtree 3. Visit the root 7, 1, 0, 3, 2, 5, 4, 6, 9, 8, 10 7 1 9 8 10 3 2 5 4 6 root =>
Binary Tree Traversal 7, 1, 0, 3, 2, 5, 4, 6, 9, 8, 10 root => 3 2 5 4 6 root => PreOder Traversal: 7, 1, 0, 3, 2, 5, 4, 6, 9, 8, 10 InOder Traversal: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 PostOder Traversal: 0, 2, 4, 6, 5, 3, 1, 8, 10, 9, 7
operation ที่ต้องทำใน BST BST มี operation ที่สำคัญอยู่ 2 operation คือ การเพิ่มโหนด การลบโหนด เพิ่มแล้วโหนดใหม่ต้องเป็น Leaf เท่านั้น เพิ่มในตำแหน่งที่ยังคงคุณสมบัติของ Binary Search Tree ไว้
ตัวอย่าง การเพิ่มข้อมูลใน Binary Search Tree
การลบโหนด ใน BST <== ลบได้เลย <== ดึง Right Subtree ขึ้นมา ต้องพิจารณาว่า Node ที่จะลบนั้นตรงกับกรณี 1. ไม่มี Child 2. มีเฉพาะ Right Subtree 3. มีเฉพาะ Left Subtree 4. มีทั้ง Left และ Right Subtree <== ลบได้เลย <== ดึง Right Subtree ขึ้นมา <== ดึง Left Subtree ขึ้นมา นำค่าที่มากที่สุดของ Left Subtree มาแทน
ตัวอย่าง กรณีที่ 1 ไม่มีโหนดลูก 23 18 X 44 before delete 44 23 X 18 after delete 44
ตัวอย่าง กรณีที่ 2 มีเฉพาะ right subtreee 23 18 X 44 before delete 44 46 58 after delete 44 23 18 X 46 58
ตัวอย่าง กรณีที่ 3 มีเฉพาะ left subtreee 23 18 X 44 before delete 44 36 28 23 18 X after delete 44 36 28
ตัวอย่าง กรณีที่ 4 มีโหนดลูกทั้ง 2 ข้าง 23 18 44 X before delete 23 20 10 20 18 X 44 after delete 23 10
การสร้าง BST insert 10 insert 15 insert 8 10 X 10 X 15 10 15 X 8 เนื่องจากการป้อนข้อมูลไม่สามารถเปลี่ยนลำดับได้ เช่น 10 15 8 14 13 12 insert 10 insert 15 insert 8 10 X 10 X 15 10 15 X 8
insert 14 10 15 X 8 14 insert 12 10 15 X 8 14 13 12 insert 13 10 15 X 8 14 13
10 X 12 18 24 25 คุณภาพของ BST ขึ้นอยู่กับการกระจายค่าของข้อมูล เช่น ชุดข้อมูล 10 12 18 24 35 10 X 12 18 24 25
ข้อเสีย : ความเร็วในการค้นหาข้อมูลจะแย่ (กรณีแย่ที่สุดคือต้องเปรียบเทียบ n ครั้ง) ปี 1960 นักคณิตศาสตร์ชาวรัสเซียได้พัฒนาเทคนิคในการจัดรูปแบบของ BST โดยปรับแต่งโหนดให้สมดุลหรือเกือบสมดุล ทุกครั้งที่มีการเพิ่มหรือลบข้อมูล และยังคงคุณสมบัติของ BST อยู่ เรียกต้นไม้ชนิดนี้ว่า AVL tree หรือ ต้นไม้ความสูงสมดุล
AVL tree (Adel’son, Vel’skii and Landis) เรียกอีกอย่างว่า (Height-balanced binary search tree) หรือ ต้นไม้ความสูงสมดุล คือ BST ชนิดหนึ่งที่มีคุณสมบัติเพิ่มเติมคือ ทุก subtree มี balance factor (bf) แตกต่างกันไม่เกิน 1 [-1, 0, +1] bf คือ ความสูงของ left subtree ลบด้วย ความสูงของ right subtree bf = | HL - HR | | bf | <= 1
-7 1 -6 1 -1 -5 -4 -3 -2 -1
AVL tree unbalanced BST
การเพิ่ม , ลบโหนดออกจาก AVL Tree ใช้วิธีการเดียวกันกับการเพิ่ม , ลบ โหนดจาก BST การเพิ่ม – เพิ่มที่ตำแหน่งที่เป็น leaf เท่านั้น การลบ – มี 4 กรณี หลังจากเพิ่ม – ลบ โหนดทุกๆ ครั้ง
Balancing Tree (หลักการทำต้นไม้ให้สมดุล) คือการปรับต้นไม้ที่ไม่เป็น AVL tree ให้เป็น AVL tree ( | bf | <= 1 , | HL - HR | <= 1 ) เกิดขึ้นทุกครั้งหลังการเพิ่มหรือลบโหนด ซึ่งทำให้ต้นไม้ขาดคุณสมบัติของ AVL tree ไป มีกรณีที่ต้องจำอยู่ 4 กรณี คือ - SLR (single left rotation) - SRR (single right rotation) - DLR (double left rotation) - DRR (double right rotation)
SLR (single left rotation) ใช้ในกรณีที่โหนดล่างสุด ที่ไม่สมดุลมี bf = -2 (right subtree ของโหนดนี้สูงกว่า left subtree อยู่ 2) ดังนั้นจึงต้องมีการหมุนไปทางซ้าย และโหนดลูกทางด้านขวาของโหนดข้างบนมี bf = -1 (right subtree ของโหนดนี้ก็ยังสูงกว่า left subtree อยู่ 1) ซึ่งหมายความว่าต้นไม้มีการเอียงไปทางด้านขวาตลอด ดังนั้นจึงหมุนไปทางซ้ายแค่ครั้งเดียว
เปลี่ยนตำแหน่งของ subtree B กรณีมี 3 โหนด (-2) (0) 10 20 (-1) 20 (0) (0) (0) 30 10 30 เปลี่ยนตำแหน่งของ subtree B กรณีทั่วไป (-2) 10 (-1) (0) 20 20 A (0) (-1,1) (-1,1) 30 10 30 B C D A B C D
SLR
SRR (single right rotation) ใช้ในกรณีที่โหนดล่างสุดที่ไม่สมดุลมี bf = 2 (left subtree ของโหนดนี้สูงกว่า right subtree อยู่ 2) ดังนั้นจึงต้องมีการหมุนไปทางขวา และโหนดลูกทางด้านซ้ายของโหนดนี้มี bf = 1 (left subtree ของโหนดนี้ก็ยังสูงกว่า right subtree อยู่ 1) ซึ่งหมายความว่าต้นไม้มีการเอียงไปทางด้านซ้ายตลอด ดังนั้นจึงหมุนไปทางขวาแค่ครั้งเดียว
เปลี่ยนตำแหน่งของ subtree C กรณีมี 3 โหนด (2) 30 (0) 20 (1) 20 (0) (0) (0) 10 10 30 กรณีทั่วไป เปลี่ยนตำแหน่งของ subtree C (2) 30 (1) (0) 20 20 D (0) (-1,1) (-1,1) 10 30 10 C A A C B B D
SRR
DLR (double left rotation) ใช้ในกรณีที่โหนดล่างสุด ที่ไม่สมดุลมี bf = -2 (right subtree ของโหนดนี้สูงกว่า left subtree อยู่ 2) ดังนั้นจึงต้องมีการหมุนไปทางซ้าย แต่โหนดลูกทางด้านขวาของโหนดข้างบน มี bf = 1 (right subtree ของโหนดลูกกลับต่ำกว่า left subtree อยู่ 1) ซึ่งหมายความว่าต้นไม้มีการเอียงไปทางด้านขวาและด้านซ้าย ดังนั้นจึงหมุนไปทางซ้าย 2 ครั้ง
เปลี่ยนตำแหน่งของ subtree B,C กรณีมี 3 โหนด (-2) 10 (0) 20 (1) 30 (0) (0) (0) 20 10 30 เปลี่ยนตำแหน่งของ subtree B,C กรณีทั่วไป (-2) 10 (1) (0) 30 20 A (1,0) (0,-1) (-1,1) 20 10 30 D B C A C D B
DLR case ที่ 1
DLR + case ที่ 2
DRR (double right rotation) ใช้ในกรณีที่โหนดล่างสุดที่ไม่สมดุลมี bf = 2 (left subtree ของโหนดนี้สูงกว่า right subtree อยู่ 2) ดังนั้นจึงต้องมีการหมุนไปทางขวา แต่โหนดลูกทางด้านซ้ายของโหนดนี้ มี bf = -1 (left subtree ของโหนดนี้กลับต่ำกว่า right subtree อยู่ 1) ซึ่งหมายความว่าต้นไม้มีการเอียงไปทางด้านซ้ายและด้านขวา ดังนั้นจึงหมุนไปทางขวา 2 ครั้ง
เปลี่ยนตำแหน่งของ subtree B,C กรณีมี 3 โหนด (2) 30 (0) 20 (-1) 10 (0) (0) (0) 20 10 30 เปลี่ยนตำแหน่งของ subtree B,C กรณีทั่วไป (2) 30 (-1) (0) 20 20 D (0,1) (-1,0) (1,-1) 10 30 A 10 A C C B D B
DRR case ที่ 1
DRR case ที่ 2
การบ้าน 1.จงสร้าง AVL Tree จากข้อมูลต่อไปนี้ 3 2 1 4 5 6 7 16 15 14 13 11