350 likes | 1.33k Views
บทที่ 7 ต้นไม้( Tree). วัตถุประสงค์ บอกลักษณะโครงสร้างข้อมูลแบบต้นไม้ได้ บอกลักษณะของไบนารีทรีได้ สามารถแปลงต้นไม้ใดๆ ให้เป็นต้นไม้แบบทวิภาคได้ อธิบายหลักการแทนที่ต้นไม้ในหน่วยความจำได้ แสดงการท่องไปในต้นไม้ได้แบบต่างๆ ได้ ประยุกต์ใช้ต้นไม้ในทางคณิตศาสตร์ได้ . ต้นไม้( Tree).
E N D
บทที่ 7 ต้นไม้(Tree) • วัตถุประสงค์ • บอกลักษณะโครงสร้างข้อมูลแบบต้นไม้ได้ • บอกลักษณะของไบนารีทรีได้ • สามารถแปลงต้นไม้ใดๆ ให้เป็นต้นไม้แบบทวิภาคได้ • อธิบายหลักการแทนที่ต้นไม้ในหน่วยความจำได้ • แสดงการท่องไปในต้นไม้ได้แบบต่างๆ ได้ • ประยุกต์ใช้ต้นไม้ในทางคณิตศาสตร์ได้
ต้นไม้(Tree) โครงสร้างข้อมูลแบบไม่ต่อเนื่อง(non linear list) ที่มีลักษณะแตกกิ่งก้านสาขาออกไปเหมือนต้นไม้โดยมองจากล่างขึ้นบน โครงสร้างของข้อมูลจะใช้ความสัมพันธ์ของข้อมูลแบบลำดับชั้น เป็นตัวเชื่อมโยงระหว่างข้อมูล ซึ่งโครงสร้างข้อมูลแบบต้นไม้ จะประกอบด้วยโหนด(node) ตั้งแต่ 1 โหนดขึ้นไป และจะต้องมีต้นไม้ย่อย(subtree) ดังภาพ A B K H C M E G L D N O F I J
ส่วนประกอบของต้นไม้(Tree)ส่วนประกอบของต้นไม้(Tree) • ต้นไม้ ประกอบด้วยโหนด A จนถึง O • ต้นไม้ย่อย(subtree) ของ A ได้แก่ B H และ K เป็นต้น ซึ่งการกล่าวถึงต้นไม้ย่อย จะรวมถึงโหนดในต้นไม้ย่อยนั้น • ต้นไม้ย่อยของ A=(BCEGDF) (H I J) (K L M N O) • ต้นไม้ย่อยของ B = (CD ) (E F) (G) • ต้นไม้ย่อยของ H = (I) (J) • ต้นไม้ย่อยของ K = (L) (M N O) A B K H C M E G L D N O F I J
นิยามต้นไม้(Tree) • ดีกรีของโหนด(degree of node)หมายถึงจำนวนต้นไม้ย่อยในแต่ละโหนด เช่น ดีกรีของโหนด A=3 B=3 H=2 • โหนดที่เป็นใบ(leaf node) คือโหนดที่ไม่มีต้นไม้ย่อย หรือ มีดีกรีเป็นศูนย์ บางครั้งเรียกโหนดปลายทาง(terminal node) ได้แก่D F G I J L N O • โหนดที่เป็นกิ่ง(branch node) คือโหนดที่มีต้นไม้ย่อย หรือโหนดที่มีดีกรีไม่เท่ากับศูนย์เช่น ABCEHKM • ระดับของโหนด(level of node) คือ ระดับที่โหนดนั้นอยู่ในแนวดิ่ง โดยกำหนดให้โหนดที่เป็นราก มีระดับเป็น 1 จากรูปจะได้ว่า • - ระดับของโหนดที่ 1 ได้แก่ A - ระดับของโหนดที่ 2 ได้แก่ B H K • - ระดับของโหนดที่ 3 ได้แก่ C E G I J L M - ระดับของโหนดที่ 4 ได้แก่ D F N O • ความสูงของต้นไม้ (height หรือ depth) คือจำนวนระดับของต้นไม้ใดๆ เช่น ต้นไม้จากรูปมีความสูงเท่ากับ 4
นิยามต้นไม้(Tree) • โหนดพ่อ(parent) คือโหนดรากของ ต้นไม้แต่ละต้น เช่น A เป็นพ่อของ BHK • โหนดพี่น้อง(brothers หรือ siblings) คือโหนดที่เกิดจากพ่อเดียวกัน เช่น BHK • โหนดพี่(oldest brothers) คือโหนดที่อยู่ทางซ้ายมือสุด เช่น B เป็นพี่ของ HK • โหนดน้อง(youngers) คือโหนดที่ถัดมาทางขวาของโหนดพี่ เช่น H • โหนดน้องสุดท้อง(youngest brothers) คือโหนดถัดมาทางขวาของโหนดน้อง เช่น K เป็นน้องสุดท้องของ BHK • โหนดลูกหลาน(decendants) คือ โหนดที่อยู่ต่อจากโหนดที่เป็นพ่อแม่ลงมาทั้งหมด เช่น O เป็นลูกหลานของ AKM • โหนดบรรพบุรุษ(ancestors) คือโหนดที่อยู่ก่อนโหนดที่กำหนดขึ้นไปเป็นสายเดียวกัน เช่น A เป็นบรรพบุรุษของ BHK
ชนิดของต้นไม้ แบ่งตามการจัดลำดับของโหนดต้นไม้ย่อยได้ 2 ชนิด คือ 1. ต้นไม้แบบอันดับ(ordered tree) เป็นลักษณะการให้ความสำคัญของตำแหน่งของ โหนดเป็นหลักในการพิจารณาความแตกต่างระหว่างต้นไม้จากรูปถือว่า ต้นไม้ทั้งสี่ต้นไม่เหมือนกัน 2. ออเรนเต็ดทรี(Oriented tree)เป็นลักษณะที่ไม่ถือความสำคัญของตำแหน่งของโหนด จากรูป ถือว่าต้นไม้ทั้งสี่เป็นต้นเดียวกัน A A A A B C B C B C B C D E E D D E E D
ป่า(Forest) คือ เซตของโหนดที่ไม่มีโหนดราก จากรูปเมื่อกล่าวถึงต้นไม้ จะได้โหนด A ถึงโหนด O และป่า จะหมายถึง กลุ่มของต้นไม้ที่เหลือที่ไม่มีราก ได้แก่ B HK A B K H C M E G L D N O F I J
การแวะผ่านป่า(Forest) คือการนำโหนดในโครงสร้างต้นไม้ มาเขียนเรียงลำดับให้อยู่ในแนวเส้นตรง ซึ่งจะเขียนทีละระดับจากซ้ายไปขวา (level by level)มี 2 แบบ คือ 1. การแวะผ่านจากบนลงล่าง(top down traversal)คือการเริ่มแวะผ่านจากโหนดรากแล้วลงไปในระดับที่ 2 จากซ้ายไปขวาพอหมดก็ลงไประดับ 3 ไปเรื่อยๆ จากรูป จะได้ A BHK CEG IJLM DFNO 2. การแวะผ่านจากล่างขึ้นบน(bottom up traversal)คือการเริ่มแวะผ่านจากระดับที่อยู่ไกลจากโหนดรากมากที่สุดก่อน โดยทำจากซ้ายมาขวา จะได้ DFNO IJLM CEG BHK A A B K H C M E G L D N O F I J
Binary Tree ต้นไม้แบบทวิภาคคือ ต้นไม้ที่มีกิ่งยื่นออกมา (out degree) ของทุกๆ โหนดน้อยกว่าหรือเท่ากับสองโหนด ซึ่งถ้ามีกิ่งยื่นออกมาเท่ากับสองหรือศูนย์ จะเรียกว่า ต้นไม้เต็มต้นแบบทวิภาค(full binary)หรือ ต้นไม้บริบูรณ์แบบทวิภาค(complete binary tree) ดังภาพแสดง binary tree
Binary Tree ถ้าแต่ละโหนดมีดีกรีหรือจำนวนกิ่ง ที่ยื่นออกมา(out degree)สูงสุดเท่ากับสอง ซึ่งแต่ละโหนดมีต้นไม้ย่อยได้มากสุดเพียงสองต้นไม้ย่อย โดยเรียกต้นไม้ย่อยทางซ้ายว่า left sub tree หรือ left child และเรียกต้นไม้ย่อยทางขวาว่าright sub tree หรือ right child ดังภาพแสดง full binary tree
การเปลี่ยน Tree ให้เป็น Binary Tree • ต้นไม้แบบออดินารี(ordinary)คือต้นไม้ที่มีดีกรีสูงสุดของแต่ละโหนดเป็นเท่าไรก็ได้ ซึ่งการเปลี่ยนให้เป็น binary tree เป็นการจัดให้แต่ละโหนดมีดีกรีสูงสุดเท่ากับสอง มีขั้นตอนดังนี้ • 1. พิจารณาที่กิ่งทางซ้ายสุดที่อยู่ใต้พ่อเดียวกัน • 2. ต่อกิ่งของโหนดทางซ้ายสุดในขั้นที่ 1 ไปทางขวาตามลำดับอาวุโสกับพี่น้องที่เกิดจากพ่อเดียวกัน • 3. ทำขั้นที่ 1 และ 2 จนครบทุกโหนด • 4. ปรับมุมของแต่ละกิ่ง ประมาณ 45 องศา
การเปลี่ยน Tree ให้เป็น Binary Tree ขั้นที่ 1 ขั้นที่ 4 ขั้นที่ 2 ขั้นที่ 3
การเปลี่ยน Tree ให้เป็น Binary Tree A ตัวอย่าง แสดงการเปลี่ยนต้นไม้ให้เป็นแบบทวิภาค โจทย์ A B F B F C K D G J C K D G J E H L I E H A L I B F ขั้นที่ 1-3 C G D J K ผลลัพธ์ E L H I
การเปลี่ยน Forest ให้เป็น Binary Tree โจทย์ A S B C T U D E F G V W X Y Z A ผลลัพธ์ S B T C U D V G X E Y W F Z
การเก็บ Binary Tree ในหน่วยความจำ • การเก็บต้นไม้ในหน่วยความจำแบบเรียงลำดับ(sequential link) • คือ การแทน binary treeด้วย full binary treeโดยใช้โครงสร้างข้อมูลแบบแถวลำดับชนิด 1 มิติมาช่วย โดยจะกำหนดหมายเลขให้กับโหนด เริ่มจาก 1 ถึง n และจะเริ่มจากโหนดรากก่อนเสมอ ซึ่งหมายเลขกำกับโหนดแต่ละตัวจะหมายถึงตำแหน่งที่อยู่ของโหนดด้วย 1 A 2 3 B C 6 4 D 5 7 1 2 3 4 5 6 7
การเก็บ Binary Tree ในหน่วยความจำ 2. การเก็บต้นไม้ในหน่วยความจำแบบจัดสรรการเชื่อมโยง(link allocation) เป็นการแทนโครงสร้างต้นไม้ที่ใช้งานได้ดีกว่าแบบแถวลำดับเนื่องจากการแทรกและการลบโหนดออกจากโครงสร้างต้นไม้สามารถทำได้ไม่จำกัด และไม่เปลืองเนื้อที่สำหรับโหนดที่ขาดหายไป ดังนั้นในการแทนโครงสร้างต้นไม้แบบทวิภาคโดยใช้เทคนิคของวิธีการจัดสรรการเชื่อมโยงจะให้ความสำคัญของตำแหน่งต้นไม้ย่อยทางซ้ายและทางขวาซึ่งมีความแตกต่างกัน A B D C E F G
การแวะผ่าน Binary Tree การแวะผ่านโหนด หมายถึง การเข้าไปในโครงสร้างต้นไม้เพื่อนำข้อมูลในโหนดมาแสดงหรือเพื่อการค้นหา หรือการประมวลผล การเดินเยี่ยมโหนดมี 3 วิธี 1. Inorder traversal หรือ Symmetric order จะทำการเยี่ยมโหนดในต้นไม้ย่อยทางซ้ายแบบอินออเดอร์ ก่อนเยี่ยมโหนดรากและเยี่ยมโหนดในต้นไม้ย่อยทางขวาแบบอินออเดอร์(Left/ Root/Right) 2. Preorder traversal จะทำการเยี่ยมโหนดรากก่อน เยี่ยมโหนดในต้นไม้ย่อยทางซ้ายแบบพรีออเดอร์ และเยี่ยมโหนดในต้นไม้ย่อยทางขวาแบบพรีออเดอร์(Root/ Left/ Right) 3. Postorder traversal หรือ Endorder จะทำการเยี่ยมโหนดในต้นไม้ย่อยทางซ้ายแบบ โพสออเดอร์ ก่อนเยี่ยมโหนดในต้นไม้ย่อยทางขวาแบบ โพสออเดอร์ และเยี่ยมโหนดราก(Left/ Right/ Root)
การแวะผ่าน Binary Tree A 1. แบบอินออเดอร์(Left/ Root/Right) จากภาพจะได้ BAC 2. แบบพรีออเดอร์(Root/ Left/ Right)จากภาพจะได้ ABC 3. แบบโพสออเดอร์(Left/ Right/ Root)จากภาพจะได้ BCA 1. แบบอินออเดอร์(Left/ Root/Right)จากภาพจะได้ DB A EG C HFI 2. แบบพรีออเดอร์(Root/ Left/ Right) จากภาพจะได้ A BD CEG FHI 3. แบบโพสออเดอร์(Left/ Right/ Root)จากภาพจะได้ DB GE HIF C A B C A B C D E F G H I
การประยุกต์ใช้ต้นไม้กับนิพจน์ทางคณิตศาสตร์การประยุกต์ใช้ต้นไม้กับนิพจน์ทางคณิตศาสตร์ • นิพจน์ทางคณิตศาสตร์ สามารถเขียนได้ 3 รูปแบบ คือ • 1. Infix Form คือการเขียนนิพจน์คณิตศาสตร์ ที่มีเครื่องหมายอยู่ระหว่างตัวกระทำ เช่น X * Y + Z • X – Y / R * D • A – B / C ^ R * S + D • 2. Prefix Form คือการเขียนนิพจน์คณิตศาสตร์ ที่มีเครื่องหมายอยู่หน้าตัวกระทำ • เช่น+ * X Y Z • - X * / Y R D • - A / B + * ^ C R S D • 3.Postfix Formคือการเขียนนิพจน์คณิตศาสตร์ที่มีเครื่องหมายอยู่หลังตัวกระทำ • เช่น X Y * Z + X Y R / D * - A B C R ^ / S * D - +
Expression Tree คือต้นไม้ที่สร้างขึ้นจากตัวกระทำ(operand) และเครื่องหมาย(operators) ทางคณิตศาสตร์ของนิพจน์ โดยการวางตัวกระทำที่โหนดใบ(leavenode) และวางเครื่องหมายไว้ที่โหนดภายใน สำหรับเครื่องหมายที่เป็นเครื่องหมายเดี่ยว(unary operator)จะมีกิ่งต้นไม้ย่อยเพียงข้างเดียว เรามักจะวาง เครื่องหมายเดี่ยวไว้ทางซ้ายของตัวกระทำ ซึ่งเครื่องหมายที่จัดเป็นเครื่องหมายเดี่ยว ได้แก่ - log() cos() และมีเครื่องหมายเดี่ยว ที่ถูกจัดวางไว้ทางขวาของตัวกระทำ ได้แก่ แฟกทอเรียลฟังก์ชันเลขยกกำลังต่างๆ ตัวอย่าง แสดงการสร้าง เอ็กเพรสชันทรีแบบทวิภาค จากนิพจน์X * Y + Z + * Z X Y
Expression Tree • ตัวอย่างแสดงการสร้างเอ็กเพรสชันทรีจากนิพจน์ (X – ((Y / R) * D)) • จะได้ว่า • การเยี่ยมโหนด แบบอินออเดอร์จะได้ X-Y/R*D ซึ่งอยู่ในรูปอินฟิกฟอร์ม • การเยี่ยมโหนด แบบพรีออเดอร์จะได้ -X*/YRD ซึ่งอยู่ในรูปพรีฟิกฟอร์ม • การเยี่ยมโหนด แบบโพสออเดอร์ จะได้ XYR/D*- ซึ่งอยู่ในรูปโพสฟิกฟอร์ม - X * / D Y R
Binary Search Tree • มีลักษณะดังนี้ • 1. ค่าคงที่ที่อยู่ในโหนดของต้นไม้ย่อยทางซ้าย จะมีค่าน้อยกว่าค่าคงที่ที่เป็นโหนดราก • 2. ค่าคงที่ที่อยู่ในโหนดของต้นไม้ย่อยทางขวา จะมีค่ามากกว่าค่าคงที่ที่เป็นโหนดราก • 3. ต้นไม้ย่อยทางซ้ายและต้นไม้ย่อยทางขวา ก็จะมีลักษณะเหมือนกับโหนด 1 และ ข้อ 2 ด้วย • 4. เมื่อเยี่ยมโหนดแบบอินออเดอร์ข้อมูลที่ได้จะเรียงลำดับเสมอ
Binary Search Tree ตัวอย่าง แสดงการสร้างต้นไม้ค้นหาแบบทวิภาคจากข้อมูลต่อไปนี้ 5 9 41 25 4 89 แล้วเยี่ยมโหนดแบบอินออเดอร์(Left/Root/Right) การเยี่ยมโหนดแบบอินออเดอร์จะได้ 4 5 9 25 41 89 5 4 9 41 25 89
Binary Search Tree ตัวอย่าง แสดงสร้างต้นไม้ค้นหาแบบทวิภาค จากข้อมูลต่อไปนี้ 6 5 2 3 4 8 7 9 แล้วเยี่ยมโหนดแบบอินออเดอร์ การเยี่ยมโหนดแบบอินออเดอร์จะได้ 2 3 4 5 6 7 8 9 6 5 8 2 7 9 3 4
Binary Search Tree การลบโหนดออกจากต้นไม้ค้นหาแบบทวิภาค การลบโหนดจะต้องคงสภาพของต้นไม้ไว้เช่นเดิม การลบโหนดออกอาจทำได้ 3 กรณี ดังนี้ 1. ลบโหนดที่เป็นใบ เช่น โหนด 4 7 9 2. ลบโหนดที่มีเพียงต้นไม้ย่อยทางซ้ายหรือทางขวา เช่น โหนด 2 หรือ 3 เมื่อลบแล้วจะนำโหนดย่อยมาวางแทน 3. ลบโหนดที่มีทั้งต้นไม้ย่อยซ้ายและต้นไม้ย่อยขวา เช่น โหนด 6 8 เมื่อลบแล้วจะนำโหนดที่อยู่ขวาสุดหรือซ้ายสุดของโหนดที่ถูกลบขึ้นมาแทนตำแหน่งที่ลบไป
การลบข้อมูลออกจากต้นไม้ค้นหาแบบทวิภาคการลบข้อมูลออกจากต้นไม้ค้นหาแบบทวิภาค ตัวอย่าง แสดงการลบโหนด ณ ตำแหน่งต่างๆ แสดงการลบโหนดใบ เช่น 4 6 5 8 2 7 9 3 6 4 5 8 2 7 9 3
การลบข้อมูลออกจากต้นไม้ค้นหาแบบทวิภาคการลบข้อมูลออกจากต้นไม้ค้นหาแบบทวิภาค แสดงการลบโหนดที่มีเพียงต้นไม้ย่อยทางซ้ายหรือทางขวา เช่น โหนด 2 แสดงการลบ 6 6 6 5 8 5 8 2 7 9 3 7 9 3 7 5 หรือ 5 8 3 8 3 9 7 9
งาน 1. จงสร้าง Expression tree จากนิพจน์ต่อไปนี้ 1.1 A+S-D*F-E*D/C 1.2 D-S*A*D^F-E+W 1.3 Q+E-W*S-F*S/A*S 1.4 D/E*4-W*F^Y-U+I 1.5 W+E/R*T-G+F/D/T 2. จงสร้าง Binary Search Tree จากตัวเลข 5 6 9 8 7 4 18 2 19 3 3. จากข้อ 2 จงแสดงการลบ 9,4,7