Upload
others
View
8
Download
0
Embed Size (px)
Citation preview
บทที่ 5 โครงสร้างข้อมูลแบบต้นไม้ (Tree Data Structure)
โครงสร้างข้อมูลแบบต้นไม้ เป็นโครงสร้างชนิดไม่เชิงเส้นที่สําคัญที่สุดของโครงสร้างข้อมูล
โครงสร้างต้นไม้มีความสัมพันธ์อย่างใกล้ชิดกับธรรมชาติของข่าวสารและวิธีการแปลงข่าวสารมาก โครงสร้างต้นไม้มีลักษณะที่สมชื่อของตนเอง เพราะมีลักษณะคล้ายกิ่งก้านของต้นไม้ ต้นไม้ตามธรรมชาติ จะงอกจากล่างไปบน ส่วนโครงสร้างข้อมูลที่มีลักษณะต้นไม้นั้นเราจะวาดหรือให้เจริญจากบนลงมาล่างดังรูป จุดที่มีการแตกกิ่งก้านสาขาออกไปจะเรียกว่าโหนด (node) โดยข่าวสารจะเก็บอยู่ที่โหนด กิ่งที่ต่อระหว่าง โหนด จะแสดงความสัมพันธ์ระหว่างโหนดเรียกว่าลิงค์ (link) อนึ่งตามรูป (ข) จุดปลายของกิ่งจะเรียกว่า โหนด ด้วย ! โครงสร้างข้อมูลแบบต้นไม้
! เป็นโครงสร้างไม่เชิงเส้น (Non Linear) มีลักษณะคล้ายกิ่งก้านต้นไม้ แตกกิ่งก้านออกไป เช่นเดียว กับธรรมชาติของข่าวสารข้อมูล
! ต้นไม้แตกกิ่งจากล่างไปบน แต่โครงสร้างข้อมูลในคอมพิวเตอร์จะกลับหัว รากอยู่บน กิ่งอยู่ด้านล่าง ! จุดที่แตกกิ่งออกไป เรียกว่าโหนด (Node) ข่าวสารเก็บอยู่ที่โหนด ! จุดเชื่อมโหนดเรียกว่าลิงค์ (Link)
! นิยามโครงสร้างต้นไม้
! มีโหนดพิเศษเรียกว่า รากหรือรูต (root node), R ! โหนดอื่น ๆ ที่ไม่ใช่รูต ถูกแบ่งย่อยออกเป็น n กลุ่ม แต่ละกลุ่มไม่มีโหนดร่วมกันเลย แต่ละกลุ่ม
ก็เป็นต้นไม้เหมือนกัน แต่เรียกว่าเป็นต้นไม้ย่อย (Sub tree) ! โครงสร้างต้นไม้
! R คือรูตโหนดของต้นไม้ย่อย A,B,C,D ! A คือรูตโหนดของต้นไม้ย่อย E, F, G ! F คือรูตโหนดของต้นไม้ย่อย J ! B คือรูตโหนดของต้นไม้ย่อย H และ I
(ก) ต้นไม้ตามธรรมชาติ (ข) โครงสร้างข้อมูลแบบต้นไม้
2
การเรียกชื่อส่วนต่าง ๆ ของต้นไม้ ลักษณะลําดับของโครงสร้างต้นไม้ จะเรียกเช่นเดียวกับการลําดับ
บรรพบุรุษ เช่น Father, Son, Grandson บางทีก็ลําดับอีกแบบเช่น Mother, Child, Grandchild ระดับของโหนด (Level) แสดงถึงระยะทางตามแนวดิ่งว่าโหนดนั้นห่างจากรูตโหนดเท่าไร ถ้ากําหนด
ให้รูตโหนดเป็นระดับ 1 (บางที่กําหนดให้รูตโหนดเป็นระดับ 0) ให้นับระยะห่างบวกระดับของรูตโหนด เช่น 3 + 1 (หรือ 3 + 0) เป็นต้น
! ระดับของโหนด
! R คือรูตโหนด ระดับ 1 ! A,B,C,D คือโหนดระดับ 2 ! E,F,G,H,I คือโหนดระดับ 3 ! J คือโหนดระดับ 4
• ดีกรีของโหนด (Level Degree) ! คือจํานวนต้นไม้ย่อยของโหนดนั้น ! A มีดีกรี เป็น 3 ! B มีดีกรี เป็น 2 ! F มีดีกรีเป็น 1 ! C,D,E,G,H,I,J มีดีกรีเป็น 0
! โหนดที่เป็นใบ (Leaf Node) คือโหนดที่มีดีกรีเป็น 0 ส่วนโหนดที่มีดีกรีมากกว่า 0 เรียกว่า
โหนดภายใน (interior/branch node) ! A,B,F เป็นโหนดภายใน ! C,D,E,G,H,I,J เป็นโหนดใบ
ความสัมพันธ์ของโครงสร้างต้นไม้
กําหนดให้โหนดราก (Root) คือ จุดยอด V0 และ x, y, z เป็นจุดยอดในต้นไม้ และ (V0 , V1 , ….,Vn ) เป็นทางเดินในต้นไม้จะกล่าวว่า 1) Vn-1 เป็น บิดามารดา (Parent) ของ Vn 2) V0,…,Vn-1 เป็น บรรพบุรุษ (Ancestor) ของ Vn 3) Vn เป็น ลูก (Child) ของ Vn-1 4) ถ้า x เป็นบรรพบุรุษของ y จะได้ว่า y เป็น ผู้มาทีหลัง (Descendant) x 5) ถ้า x และ y เป็นลูกของ z จะได้ x และ y เป็น พี่น้องกัน (Siblings) 6) ถ้า x ไม่มีลูก x จะเป็น จุดยอดที่สิ้นสุด (Leaf Node) หรือใบไม้ 7) ถ้า x ไม่ใช่จุดยอดที่สิ้นสุด x จะเป็น จุดยอดภายใน (Internal vertex) หรือ กิ่ง 8) กราฟย่อยของ T ประกอบด้วยจุดยอด x และโหนดที่มาทีหลังนับจากบรรพบุรุษของมันทั้งหมด โดยมีโหนด x เป็นราก และเรียกว่า ต้นไม้ย่อยของต้นไม้ที่มีราก x
3
ความสัมพันธ์ของโครงสร้างต้นไม้ ป่า (Forest) คือ โครงสร้างต้นไม้ที่นําเอาโหนดราก (Root) ออกไปเหลือเฉพาะต้นไม้หรือกิ่งของโครงสร้างต้นไม้นั้น ๆ
ป่าที่ประกอบด้วยต้นไม้ A ,B และ X
โครงสร้างต้นไม้แบบทวิภาค (Binary Tree) โครงสร้างต้นไม้ทวิภาค (Binary Tree) คือ ต้นไม้ที่มีโหนดราก (Root) และทุกจุดยอดอาจมีลูก (Child) ทางซ้าย, ลูกทางขวา, ลูกทางซ้ายและลูกทางขวา หรือไม่มีลูกเลย โครงสร้างต้นไม้ทวิภาคแบบสมบูรณ์ (Complete Binary Tree) คือ โครงสร้างตน้ไม้ทวิภาคที่ทุก จุดยอดมีลูกทั้งสองด้านหรือไม่มีลูกเลย
4
แสดงโครงสร้างต้นไม้ทวิภาค (Binary Tree) โครงสร้างต้นไม้ทั่วไป (General Trees) โครงสร้างต้นไม้ทั่วไป คือ เซตจํากัด T ที่มีสมาชิกเรียกว่าโหนด ซึ่งประกอบด้วยคุณลักษณะดังนี้
1. T เป็นต้นไม้ว่าง (Null Tree หรือ Empty Tree) หรือ 2. T มีสมาชิกพิเศษ คือ โหนด R อยู่หนึ่งโหนดที่เรียกว่า Root Node 3. สมาชิกที่เหลือของ T อาจประกอบด้วยต้นไม้ย่อยที่มีจํานวนสมาชิกเป็นศูนย์หรือมากกว่า ได้แก่ T1, T2 , …, Tท การแทนโครงสร้างต้นไม้ คือ การแทนความสัมพันธ์ที่เกิดขึ้นจากรูปโครงสร้างต้นไม้ด้วยรูปที่สามารถประมวลผลด้วย คอมพิวเตอร์ ซึ่งแบ่งออกเป็น 2 วิธี ได้แก ่
1. การแทนโครงสร้างต้นไม้ด้วยโครงสร้างอาร์เรย์ (Array) การแทนโครงสร้างต้นไม้ด้วยโครงสร้างอาร์เรย์จะต้องใช้อาร์เรย์อย่างน้อย 3 ชุดสําหรับเป็น
ที่เก็บของข้อมูลและพอยน์เตอร์ที่ชี้ไปยังโหนดลูกทางด้านซ้ายและด้านขวา
แสดงการแทนโครงสร้าง ต้นไม้ด้วยอาร์เรย์
5
การแทนโครงสร้างต้นไม้ทวิภาค (Binary Trees) การแทนด้วยอาร์เรย์จะใช้อาร์เรย์ที่ขนานกันจํานวน 3 ชุด คือ INFO, LEFT และ RIGHT และ
ตัวแปร ROOT ถ้าให้ K คือตําแหน่งของโหนดจะได้ความสัมพันธ์ ดังนี้ 1. INFO [K] เก็บส่วนที่เป็นข้อมูลของโหนด N 2. LEFT [K] เก็บตําแหน่งของ Left ของโหนด N 3. RIGHT [K] เก็บตําแหน่งของ Right Child ของโหนด N 4. ROOT เก็บตําแหน่งของ Root ของต้นไม้ T
2. การแทนโครงสร้างต้นไม้ด้วยโครงสร้างรายการเชื่อมโยง (Linked List) คือ การใช้โครงสร้างข้อมูล Linked List มาแทนต้นไม้ โดยแต่ละโหนดจะประกอบด้วย 3 ส่วน คือ Left , Info ,Right โดย ส่วน Left จะเป็นตัวเชื่อมไปยังต้นไม้ย่อยในระดับถัดไปที่อยู่ทางซ้าย , Right จะชี้ไป ยังต้นไม้ย่อยในระดับถัดไปทางด้านขวา Info จะเก็บข้อมูลของโหนด และต้นไม้ย่อยที่ว่าง (ไม่มีต้นไม้ย่อยต่อ อยู่) แสดงด้วย X สําหรับค่า NULL
แสดงการแทนโครงสร้าง ต้นไม้ทวิภาคด้วยอาร์เรย์
6
การเข้าถึงข้อมูลในโครงสร้างต้นไม้ทวิภาค (Tree Traversal)
การนําต้นไม้ไบนารีมาใช้ประโยชน์นั้น หมายความว่าเราต้องมีวิธี เดิน หรือ traverse เข้าไปในต้นไม้ อย่างมีแบบแผน เพื่อไป เยี่ยม โหนดต่าง ๆ โหนดละ 1 ครั้ง คําว่า เยี่ยมหมายถึงว่าเราจะไปยังโหนดเพื่อ ประมวลผลบางอย่างที่ต้องการกระทํากับ โหนดนั้น เช่น หาข่าวสาร ดังนั้นผลลัพธ์จากการเดินเข้าไปในต้นไม้ คือจะได้ข่าวสารที่เก็บ(หรือชี้) โดยโหนดเหล่านั้นออกมาในรูปเชิงเส้น ซึ่งนําไปใช้ประโยชน์ได้ ความคิดเริ่มต้น ของการเดินก็คือ เข้าไปแต่ละโหนดพร้อมทั้งต้นไม้ย่อยทางซ้ายและทางขวาของโหนดนั้น ตามแนวความคิดนี้ เราจะแยกต้นไม้ไบนารีออกเป็น 3 ส่วนคือ R,TL,TR โดยที่ R จะแทนรูตโหนด TL จะแทนต้นไม้ย่อยทางซ้าย และ TR จะแทนต้นไม้ย่อยทางขวา จะเห็นได้ว่าจะมีวิธีเดินอยู่ 6 ทางคือ R TL TR , TL RTR , TL TR R , TR RTL , R TR TL สัญลักษณ์ที่เขียนนี้เป็นลักษณะการนิยามแบบรีเคอร์ซีฟและลําดับจากซ้ายไปขวา ถึงแม้ว่า จะมีวิธีเดิน 6 วิธี แต่เราจะสนใจเพียง 3 วิธีแรกเท่านั้น ซึ่ง 3 วิธีแรกมีชื่อเรียกพิเศษและลักษณะรายละเอียด การเดินดังนี้ 1) การเข้าถึงข้อมูลแบบพรีออร์เดอร์ (Preorder) R TL TR เยี่ยม R เดินเข้าไปใน TL (ของ R) อย่างพรีออร์เดอร์ เดินเข้าไปใน TR (ของ R) อย่างพรีออร์เดอร์ 2) การเข้าถึงข้อมูลแบบอินออร์เดอร์ (Inorder) TL RTR เดินเข้าไปใน TL (ของ R) อย่าง อินออร์เดอร์ เยี่ยม R เดินเข้าไปใน TR (ของ R) อย่างอินออร์เดอร์ 3) การเข้าถึงข้อมูลแบบโพสท์ออร์เดอร์ (Preorder) TL TR R เดินเข้าไปใน TL (ของ R) อย่าง โพสต์ออร์เดอร์ เดินเข้าไปใน TR (ของ R) อย่างโพสต์ออร์เดอร์ เยี่ยม R อีก 3 วิธี เกิดจากการสับเปลี่ยน ตําแหน่ง TL และ TR ของ 3 วิธีที่กล่าวมาแล้ว ดังนั้น 3 วิธีหลังจะมีชื่อคล้าย ๆกับ 3 วิธีแรก เพียงแต่มีคําว่า reverse เพิ่มเข้าไปเท่านั้น ดังนั้น 3 วิธีหลังจะมีชื่อดังนี้
4) แบบ reverse pre - order traversal ( R TR TL ) 5) แบบ reverse in - order traversal ( TR RTL ) 6) แบบ reverse post - order traversal ( TR TL R)
แสดงการแทนโครงสร้างต้นไม้ทวิภาคด้วยรายการเช่ือมโยง
7
ลําดับ Preoder Inorder Postorder 1 ประมวลผลที่ Root ค้นหาทางซ้ายของ R ค้นหาทางซ้ายของ R 2 ค้นหาทางซ้ายของ R ประมวลผลที่ Root ค้นหาทางขวาของR 3 ค้นหาทางขวาของR ค้นหาทางขวาของR ประมวลผลที่ Root
การเข้าถึงข้อมูลในโครงสร้างต้นไม้ทวิภาค
สังเกตว่า แต่ละวิธีจะประกอบด้วยขั้นตอนที่เหมือนกัน และต้นไม้ย่อยทางซ้ายของ Root ของถูกประมวลผลก่อนต้นไม้ย่อยทางขวามือ วิธีการทั้ง 3 บางครั้งเรียกว่า โหนด-ซ้าย-ขวา (Node-Left-Right : NLR) ,ซ้าย-โหนด-ขวา (Left-Node-Right : LNR) และ ซ้าย-ขวา-โหนด (Left-Right-Node : LRN) แต่ละวิธีการเป็นการกําหนดแบบ เรียกตัวเอง (Recursive) เนื่องจากอัลกอริทึมมีการค้นหาต้นไม้ย่อยในลําดับ ที่กําหนด ซึ่งต้องใช้โครงสร้างสแตกเมื่อมีการทํางานด้วยคอมพิวเตอร์
ลักษณะต้นไม้แบบนิยาม Recursive
Preorder = * + a – b c / - d e - + f g h Inorder = a + b - c * d – e / f + g – h
Postorder = a b c - + d e – f g + h - / *
8
โครงสร้างต้นไม้แบบ THREADED TREE คือ การนําไบนารีทรีมีการปรับปรุงแก้ไขโดยวิธีการดําเนินการแบบรายการเชื่อมโยง โดยมีการเพิ่ม
โหนดพิเศษที่เรียกว่า โหนดนำ (Header Node) ไว้ที่จุดเริ่มต้นของ T และกําหนดให้ HEAD เป็นพอยน์เตอร์ ที่ชี้ไปยัง Header Node และพอยน์เตอร์ทางซ้ายของ Header Node จะชี้ไปยัง Root ของทรี
แสดงโครงสร้างต้นไม้ที่มี Header Node