391 likes | 773 Views
โครงสร้างข้อมูลแบบต้นไม้. อ.วิวัฒน์ ชินนาทศิริกุล. นิยามของโครงสร้างต้นไม้. โครงสร้างข้อมูลแบบต้นไม้ มีคุณสมบัติดังนี้ 1. มีโหนดที่เรียกว่า รากหรือรูต (Root node) , R 2. โหนดที่ไม่ใช่รูตแบ่งย่อยออกเป็น n กลุ่ม โดยที่แต่ละกลุ่มไม่มีโหนด
E N D
โครงสร้างข้อมูลแบบต้นไม้โครงสร้างข้อมูลแบบต้นไม้ อ.วิวัฒน์ ชินนาทศิริกุล
นิยามของโครงสร้างต้นไม้นิยามของโครงสร้างต้นไม้ • โครงสร้างข้อมูลแบบต้นไม้ มีคุณสมบัติดังนี้ 1. มีโหนดที่เรียกว่า รากหรือรูต (Root node) , R 2.โหนดที่ไม่ใช่รูตแบ่งย่อยออกเป็น n กลุ่ม โดยที่แต่ละกลุ่มไม่มีโหนด ร่วมกันเลย เช่น กลุ่ม T1 , T2 ,…..Tn (n >=0) แต่ละกลุ่มก็เป็น ต้นไม้เหมือนกัน จะเรียกว่าต้นไม้ย่อย (Subtree)
ลักษณะต้นไม้แบบรีเคอร์ซีฟลักษณะต้นไม้แบบรีเคอร์ซีฟ จากรูป R เป็นรูตของต้นไม้ย่อย A,B,C,D A เป็นรูตของต้นไม้ย่อย E,F,G F เป็นรูตของต้นไม้ย่อย J B เป็นรูตของต้นไม้ย่อย H และ I
ชื่อส่วนต่างๆของต้นไม้ชื่อส่วนต่างๆของต้นไม้
ระดับของโหนด (Level) • ระดับของโหนดหนึ่ง ๆ แสดงถึงหน่วยระยะทางตามแนวดิ่งของโหนดนั้นว่าอยู่ห่างจากรูตโหนดเท่าไร ถ้ากำหนดว่ารูตโหนดของต้นไม้นั้นอยู่ที่ระดับ 1 และกิ่งทุกกิ่งมีความยาวเท่ากัน หมดคือยาว 1 หน่วย เลขระดับของโหนดใด ๆ คือจำนวนกิ่งที่น้อยที่สุดจากรูตโหนดบวกหนึ่งเช่น F มีเลขระดับเป็น 4 เป็นต้น
ดีกรีของโหนด (Level Degree) • ดีกรีของโหนดคือจำนวนต้นไม้ย่อยของโหนดนั้น จากรูป โหนด X มีดีกรี 1 โหนด A มีดีกรี 2 ส่วนโหนด H มีดีกรี 3 โหนด B มีดีกรี 1 และโหนด E มีดีกรี 0 เป็นต้น
โหนดที่เป็นใบ(Leaf Node) • โหนดที่เป็นใบ หมายถึงโหนดที่มีดีกรีเป็น 0 เช่นโหนด C, D, E, J, F และ G ส่วนโหนดที่มีดีกรีไม่เท่ากับ 0 เรียกว่า โหนดภายใน หรือinterior nodeหรือ branch node
Immediate Successor หรือ SON ของโหนด i • Immediate Successor คือโหนดทั้งหลายของต้นไม้ย่อย i ที่มีค่าระดับต่ำกว่าโหนด i อยู่หนึ่ง เช่น SON ของโหนด H คือโหนด E, I, และ F
Immediate Predecessor หรือ father ของโหนด i • Immediate Predecessor คือโหนดที่มีค่าระดับสูงกว่าโหนด i อยู่หนึ่ง เช่น FATHER ของโหนด J คือโหนด I, FATHER ของโหนด I คือโหนด H เป็นต้น
ต้นไม้แบบไบนารี (Binary Tree) • ต้นไม้ไบนารีเป็น rooted binary tree ที่ว่างเปล่า หรือประกอบด้วยรูตโหนดและต้นไม้ไบนารี 2 กลุ่มที่ไม่มีโหนดร่วมกัน แต่ละกลุ่มจะมีชื่อเรียก (โดยตำแหน่งที่อยู่หรือที่เขียน) ว่าต้นไม้ย่อยทางซ้าย (left subtree) และต้นไม้ย่อยทางขวา (right subtree) ตามลำดับคำว่า ว่างเปล่า ในนิยามหมายความว่า ต้นไม้ไบนารีต้นนั้นมีแต่รูตโหนดเพียงโหนดเดียวเท่านั้น
(ข) (ก) (ค) รูป (ก), (ข) และ (ค) เป็นต้นไม้ไบนารี
(ง) (ฉ) (จ) รูป (ง), (จ) และ (ฉ)ไม่ใช่ต้นไม้ไบนารี
ต้นไม้ไบนารีแบบสมบูรณ์ (Complete Binary Tree) • ต้นไม้ไบนารีแบบสมบูรณ์ หมายถึงต้นไม้ไบนารีที่แต่ละโหนดภายในมีโหนดย่อยซ้ายและขวา (นั่นคือแต่ละโหนดภายในมี left son และ right son ) และโหนดใบ (leaf nodes) ทั้งหลายอยู่ในระดับที่ n รูป (ก) เป็นต้นไม้ไบนารีแบบสมบูรณ์ที่มี 3 ระดับ (ก)
ต้นไม้ไบนารีแบบสมบูรณ์ที่มีโหนดใบอยู่ที่ระดับ n จะมีโหนดทั้งหมดเท่ากับ 2n-1 จากรูป จำนวนโหนดเท่ากับ 23-1 = 7โหนด
การแทนต้นไม้ไบนารีในหน่วยความจำการแทนต้นไม้ไบนารีในหน่วยความจำ • ต้นไม้ไบนารีสามารถแทนได้ 2 แบบ คือ 1. การแทนโดยอาศัยพอยน์เตอร์ 2. การแทนโดยอาศัยแอดเดรสของโหนด หรือการแทนแบบ ซีเควนเชียล (sequential)
การแทนโดยอาศัยพอยน์เตอร์การแทนโดยอาศัยพอยน์เตอร์ • ทำได้โดยให้แต่ละโหนดมีโครงสร้างดังรูปต่อไปนี้ DATA DATA หรือ LLINK RLINK LSON RSON โครงสร้างโหนดสำหรับต้นไม้ไบนารี LLINK หรือ LSON เป็นพอยน์เตอร์ชี้ไปยังต้นไม้ย่อยทางซ้าย ส่วน RLINK หรือ RSON เป็นพอยน์เตอร์ชี้ไปยังต้นไม้ย่อยทางขวา
การแทนโดยอาศัยแอดเดรสของโหนด หรือการแทนแบบซีเควนเชียล • เป็นการแทนต้นไม้ไบนารีด้วยอาร์เรย์ 1 มิติอาร์เรย์เดียว การแทนแบบนี้เหมาะกับโครงสร้างต้นไม้ไบนารีแบบ complete binary tree ที่สุด การแทนจะเริ่มต้นด้วยการให้หมายเลขแก่แต่ละโหนด ตั้งแต่ระดับ 1 ระดับ 2 ...ไปเรื่อยๆ จนถึงระดับ k การให้ตัวเลขในแต่ละระดับจะให้จากซ้ายไปขวา โดยให้รูตโหนดมีหมายเลข 1 เสมอ การให้ตัวเลขจะต้องถือว่าต้นไม้ไบนารีเป็นต้นไม้ไบนารีแบบสมบูรณ์ จึงจะให้ตัวเลขที่อยู่แก่โหนดได้
1 A 3 2 B X 4 6 7 5 C D 13 11 8 14 15 9 10 12 E การให้แอดเดรสแก่ต้นไม้ไบนารีที่ถูกต่อเติมให้สมบูรณ์ 2 4 5 7 8 9 10 11 12 13 14 15 1 3 6 A B X C D - - E - - - - - - - รูปการแทนต้นไม้โดยใช้อาร์เรย์
การเดินเข้าไปในโครงสร้างต้นไม้ (TreeTraversal) • การนำต้นไม้ไบนารีมาใช้ประโยชน์นั้น หมายความว่าต้องมีวิธี เดิน หรือ traverse เข้าไปในต้นไม้อย่างมีแบบแผน เพื่อไป เยี่ยม โหนดต่าง ๆโหนดละ 1 ครั้ง คำว่า เยี่ยม หมายถึงว่าเราจะไปยังโหนดเพื่อประมวลผลบางอย่างที่ต้องการกระทำกับโหนดนั้น เช่น หาข่าวสาร ดังนั้นผลลัพธ์จากการเดินเข้าไปในต้นไม้คือจะได้ข่าวสารที่เก็บ (หรือชี้) โดยโหนดเหล่านั้นออกมาในรูปเชิงเส้น ซึ่งนำไปใช้ประโยชน์ได้
ความคิดเริ่มต้นของการเดินก็คือ เราต้องเยี่ยมแต่ละโหนดพร้อมทั้งต้นไม้ย่อยทางซ้าย และทางขวาของโหนดนั้น ตามแนวคิดนี้เราจะแยกต้นไม้ไบนารีออกเป็น 3 ส่วนคือ R, TL และTR โดยที่ R จะแทนรูตโหนด TL จะแทนต้นไม้ย่อยทางซ้าย และ TR จะแทนต้นไม้ย่อยทางขวา จะเห็นได้ว่าจะมีวิธีเดินอยู่ 6 ทางคือ RTL TR, TL RTR, TL TRR,TRTL R,TRRTL และ RTRTL
มีวิธีเดิน 6 วิธี จะกล่าวเพียง 3 วิธีแรกเท่านั้น ซึ่ง 3 วิธีแรก มีชื่อเรียก พิเศษและลักษณะรายละเอียดการเดินดังนี้ (1) เดินแบบพรีออร์เดอร์ (pre-order traversal) - RTLTR - เยี่ยม R - เดินเข้าไปใน TL (ของ R) อย่างพรีออร์เดอร์ - เดินเข้าไปใน TR (ของ R) อย่างพรีออร์เดอร์
(2) เดินแบบอินออร์เดอร์ (in-order traversal) - TLRTR - เดินเข้าไปใน TL (ของ R) อย่างอินออร์เดอร์ - เยี่ยม R - เดินเข้าไปใน TR (ของ R) อย่างอินออร์เดอร์ (3) เดินแบบโพสต์ออร์เดอร์ (post-order traversal) - TLTRR - เดินเข้าไปใน TL (ของ R) อย่างโพสต์ออร์เดอร์ - เดินเข้าไปใน TR (ของ R) อย่างโพสต์ออร์เดอร์ - เยี่ยม R
A B C D E F G H I พรีออร์เดอร์ : ABDGCEHIF (RTLTR) อินออร์เดอร์ : DGBAHEICF (TL RTR) โพสต์ออร์เดอร์ : GDBHIEFCA (TLTR R)
Jim Ron Dot Amy Kay Guy Tim Tom Ann Eva Jan Jon Kim Roy จงท่องเข้าไปในต้นไม้ แบบ 1.พรีออร์เดอร์ 2.อินออร์เดอร์ 3.โพสต์ออร์เดอร์
+ - A * D B C จงท่องเข้าไปในต้นไม้ แบบ 1.พรีออร์เดอร์ 2.อินออร์เดอร์ 3.โพสต์ออร์เดอร์
Expression Tree เป็นต้นไม้แบบไบนารีที่ โหนดใบคือoperands, เช่นค่าคงที่หรือตัวแปร, และโหนดรากคือoperators จากรูปแสดง Expression tree ของ (a + b * c) + ((d * e + f ) * g)
การสร้าง Expression Tree • อ่านสัญลักษณ์จากนิพจน์ที่ละตัวถ้าตัวที่อ่านมาเป็น operand ให้สร้างโหนดของ tree หนึ่งโหนดแล้ว push มันลงใน stack ถ้าตัวที่อ่านมาเป็น operator ให้ pop จาก stack 2 ครั้ง ซึ่งจะได้ trees T1และT2 (T1นำออกก่อน) แล้วให้นำมาสร้างเป็น tree ใหม่ที่มีราก (root) เป็นตัว operator และมี left และ right children เป็นT2และT1ตามลำดับจากนั้นให้ใส่ tree ใหม่นี้กลับลง stack
Binary Search Trees • การประยุกต์ใช้ binary trees ที่สำคัญอย่างหนึ่ง คือ การใช้ในการค้นหาค่า • คุณสมบัติของ binary search tree คือ: 1. binary search tree เป็น binary tree, 2. ทุก ๆ โหนด, X, ใน tree, ค่าของ keys ทั้งหมดทาง left subtree จะต้องน้อยกว่าค่าของ key คือ X, และค่าทั้งหมดของ keys ทางด้าน right subtree ต้องมากกว่าค่าของ key คือ X
ไม่เป็นBinary Serach Tree เป็นBinary Serach Tree
การสร้าง Binary Search Tree • สร้าง binary searchจากข้อมูลต่ไปนี้ 10 , 5, 1, 100, 20 ,45, 3 ,19 10 5 100 1 20 45 3 19
การลบโหนดออกจาก Binary Search Tree • เมื่อพบโหนดที่ต้องการลบออกแล้ว มีประเด็นที่ต้องพิจารณา ดังนี้ 1. ถ้าโหนดนั้นเป็น leaf ก็ลบออกได้ทันที 2. ถ้ามีลูก 1 โหนด, ก็ทำการปรับ pointer ของมันให้ข้ามโหนดที่จะลบนั้นแล้วจึงทำการลบ 3. ถ้าโหนดนั้นมีลูก 2 โหนด ก็ให้แทนที่ค่าของโหนดด้วยค่าที่น้อยที่สุดของ right subtree (หาพบได้ง่าย) และให้ทำการ delete โหนดนั้นในแบบ recursive เนื่องจากโหนดที่มีค่าน้อยที่สุดใน right subtree ย่อมไม่มี left child ดังนั้น การ remove ครั้งหลังจึงทำได้ง่าย
ก่อนและหลัง การลบnode (4)ซึ่งมีchild1โหนด
ก่อนและหลังการลบโหนด (2)ที่มีลูก 2โหนด
A B D C G H E F K L I J แบบฝึกหัด 1. จากต้นไม้ไบนารีที่กำหนด ให้เขียนผลลัพธ์จากการท่องเข้าไปในต้นไม้ แบบPreorder ,Inorder , Postorder
แบบฝึกหัด (ต่อ) 2. จงสร้าง Binary Search Treeจากข้อมูลดังนี้ 10, 8, 2, 4, 3, 15, 26, 30 ,17, 6 3. จงสร้าง Expression Treeจากนิพจน์ต่อไปนี้ 3.1(A - 2 * (B + C) – D * E) * F 3.2 A + (B – C) * D ^ ( E * F )