1 / 51

บทที่ 7 ทรี ( Trees ) (ส่วนที่ 1)

บทที่ 7 ทรี ( Trees ) (ส่วนที่ 1). By Juthawut Chantharamalee. แนวคิดพื้นฐานของทรี ( Basic Tree Concepts).

xiujuan-ye
Download Presentation

บทที่ 7 ทรี ( Trees ) (ส่วนที่ 1)

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. บทที่ 7 ทรี (Trees)(ส่วนที่ 1) By Juthawut Chantharamalee วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202

  2. แนวคิดพื้นฐานของทรี (Basic Tree Concepts) โครงสร้างข้อมูลแบบทรีเป็นโครงสร้างที่มีความสัมพันธ์ในลักษณะลำดับชั้น โดยสมาชิกแต่ละโหนด (Node) ล้วนแต่มีความสัมพันธ์ในลักษณะเหมือนครอบครัวเดียวกัน โดยมีโหนดพ่อ (Parent) ที่อยู่ระดับเหนือกว่า มีเส้นเชื่อมไปยังโหนดลูก (Child) โดยที่โหนดลูกตั่งแต่สองโหนดหรือมากกว่าที่มาจากพ่อเดียวกันจะเรียกว่าโหนดพี่น้อง (Siblings) สำหรับความสัมพันธ์อื่นๆ เช่น บรรพบุรุษ (Ancestor) หรือลูกหลาน (Descendent) โหนดต่างๆ ภายในทรีจะอยู่ในระดับ (Level) ที่แตกต่างกัน วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202

  3. Root Level 0 A Branch AF Level 1 B E F Branch FI C D G H I Level 2 รูปที่ 7.1 ทรี (Trees) วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202

  4. A Subtree B B E F Root of Subtree I C D G H I รูปที่ 7.2 ซับทรี (Subtree) วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202

  5. รูปแบบการนำเสนอโครงสร้างข้อมูลทรี (Tree Representation) เราสามารถนำเสนอโครงสร้างข้อมูลทรีให้แตกต่างกันได้ถึง 3 รูปแบบด้วยกันคือ 1. แบบโครงสร้างทรีทั่วไป (General Tree) เป็นรูปแบบการนำเสนอเหมือนกับผังองค์กรทั่วไปที่ลดหลั่นเป็นลำดับขั้น ซึ่งรูปแบบดังกล่าว ถือว่าเป็นรูปแบบของทรีที่นิยมใช้งานโดยทั่วไป โดยตัวอย่างแสดงไว้ดังรูปที่ 7.3 (a) วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202

  6. 2. แบบย่อหน้า (Indent List) เป็นรูปแบบที่คล้ายกับการเขียนโปรแกรมเชิงโครงสร้าง ที่ใช้ย่อหน้าเป็นตัวกำหนดรูปแบบของโครงสร้างในส่วนระดับย่อยๆ ลงไป โดยตัวอย่างแสดงไว้ดังรูปที่ 7.3 (b) 3. แบบวงเล็บ (Parenthetical List) รูปแบบนี้มีความคล้ายคลึงกับการแทนข้อมูลด้วยนิพจน์คณิตศาสตร์ด้วยการใช้เครื่องหมายวงเล็บกำกับ โดยตัวอย่างแสดงไว้ดังรูปที่ 7.3 (c) วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202

  7. Computer Case CPU 3.5”DISK CD-ROM . . . . . . . . . Controller ALU ROM • แบบโครงสร้างทรีทั่วไป (Indent List) Computer case CPU Controller ALU ROM) 3.5 “DISK(…) CD-ROM (b) แบบย่อหน้า (Indent List) Computer ((case(…) CPU(Controller ALU … ROM) 3.5 “DISK(…) … CD-ROM(…)” ) (c) แบบวงเล็บ (Parenthetical List) รูปที่ 7.3 การนำเสนอส่วนประกอบของคอมพิวเตอร์ในรูปแบต่างๆ วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202

  8. Algorithm ConvertToParen (root, output) Convert a general tree to parenthetical notation. Pre root is a pointer to a tree node Post output contains parenthetical notation 1 Place root in output 2 if (root is a parent) 1 Place an open parenthesis in the output 2 ConvertToParen (root's first child) 3 loop (more siblings) 1 ConvertToParen (root's next child) 4 end loop 5 place close parenthesis in the output 3 end if 4 return end ConvertToParen อักอริทึมที่ 7.1 การแปลงโครงสร้างทรีแบบทั่วไปมาเป็นวงเล็บ วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202

  9. ไบนารีทรี (Binary Tree) ไบนารีทรีจัดเป็นทรีชนิดหนึ่งที่มีความสำคัญมาก โดยมีคุณสมบัติที่สำคัญคือ เป็นทรีที่สามารถมีลูกได้ไม่เกินสองโหนด ในทุกๆ โหนดอาจมีเพียงด้านซ้ายและด้านขวา หรืออาจมีลูกทั้งซ้ายและขวา หรืออาจไม่มีลูกเลยก็ได้ หรือกล่าวอีกนัยหนึ่งก็คือ เป็นทรีที่แต่ละโหนดจะมีซับทรี <=2 นั้นเอง พิจารณารูปที่ 7.4 ซึ่งเป็นไบนารีทรีที่ประกอบด้วย 2 ซับทรี โดยแต่ละซับทรีทั้งด้านซ้ายและด้านขวาต่างมีคุณสมบัติเป็นไบนารีทรี วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202

  10. No nodes (null tree) A A A B B (a) (b) (b) (d) A A B C B C D E (e) (f) A A C B B C (g) (h) รูปที่ 7.5 ไบนารีทรีรูปแบบต่าง วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202

  11. คุณสมบัติของไบนารีทรี (Properties) ด้วยคุณสมบัติของไบนารีทรี จึงทำให้ไบนารีทรีมีคุณสมบัติพิเศษกว่าทรีทั่วไป ซึ่งประกอบด้วยคุณสมบัติที่สามารถนำไปคำนวณเพื่อหาผลลัพธ์ได้ดังต่อไปนี้ ความสูงของไบนารีทรี (Height of Binary Tree) ความสูงหรือความลึกของไบนารีทรีสามารถนำไปใช้เพื่อคำนวณกับสิ่งต่อไปนี้ วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202

  12. ความสูงมากที่สุดของทรี (Maximum Height) หากต้องการจัดเก็บโหนดจำนวน N โหนดในไบนารีทรี ความสูงมากที่สุดของทรีดังกล่าวสามารถคำนวณได้จากสูตร Hmax = N EX. มีโหนดจำนวน 3 โหนด และต้องการจัดเก็บไว้ในไบนารี ความสูงมากที่สุดของทรีก็คือ Hmax เท่ากับ 3 นั้นเอง ซึ่งเป็นไปได้ดังรูปที่ 7.5 (g) หรือรูปที่ 7.5 (h) วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202

  13. ความสูงน้อยที่สุดของทรี (Minimum Height) หากต้องการจัดเก็บโหนดจำนวน N โหนดในไบนารีทรี ความสูงน้อยที่สุดของทรีดังกล่าวสามารถคำนวณได้จากสูตร Hmin = [log2 N] + 1 EX. มีโหนดจำนวน 3 โหนด และต้องการจัดเก็บไว้ในไบนารี ความสูงมากที่สุดของทรีก็คือ Hmin เท่ากับ 2 นั้นเอง ซึ่งเป็นไปได้ดังรูปที่ 7.5 (e) วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202

  14. จำนวนโหนดน้อยที่สุด (Minnimum Nodes) เราสามารถคำนวณเพื่อทำการตัดสินใจว่า จำนวนโหนดน้อยที่สุดที่สามารถมีได้ในไบนารีมีจำนวนเท่าไรได้จากสูตร Hmax = H EX. ทรีมีความสูงเท่ากับ 3 อยากทราบว่า จำนวนโหนดที่สามารถมีได้น้อยที่สุดเท่าไร จากสูตรการคำนวณข้างต้น Hmin มีค่าเท่ากับ 3 นั้นเอง ซึ่งเป็นไปได้ดังรูปที่ 7.5 (g) หรือรูปที่ 7.5 (h) วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202

  15. จำนวนโหนดมากที่สุด (Maximum Nodes) เราสามารถคำนวณเพื่อทำการตัดสินใจว่า จำนวนโหนดมากที่สุดที่สามารถมีได้ในไบนารีมีจำนวนเท่าไรได้จากสูตร (แต่ละโหนดสามารถมีลูกสูงสุดได้ไม่เกิน 2 โหนด) Hmax = 2H - 1 EX. ทรีมีความสูงเท่ากับ 3 อยากทราบว่า จำนวนโหนดที่สามารถมีได้น้อยที่สุดเท่าไร จากสูตรการคำนวณข้างต้น Hmax มีค่าเท่ากับ 7 วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202

  16. ความสมดุล (Balance) ความสมดุลหาได้จาก Balance Factor เท่ากับ 0 ซึ่งค่าดังกล่าวคำนวณได้จากการนำความสูงของซับทรีด้านซ้าย (HL) มาลบกับความสูงของซับทรีด้านขวา (HR) ที่เป็นไปตามสูตรดังนี้ B = HL - HR และจากสูตรดังกล่าว ความสมดุลของทรีจากรูปที่ 7.5 ก็คือ (a) = 0, (b) = 0, (c) = 1, (d) = -1, (e) = 0, (f) =1, (g) = -2 และ (h) = 2 วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202

  17. A HL = 0 A B B C HR = 1 C D E HR = 2 HL = 2 Balance Factor = 1 Balance Factor = -2 รูปที่ 7.6 ไบนารีทรีรูปแบบต่าง วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202

  18. ไบนารีทรีแบบสมบูรณ์และเกือบสมบูรณ์ (Complete and Nearly Complete Binary Tree) ไบนารีทรีแบบสมบูรณ์นั้นจะมีจำนวนโหนดสูงสุดที่สามารมีได้ ซึ่งเป็นไปตามสูตร Hmax โดยโหนดของซับทรีด้านซ้ายและซับทรีด้านขวาจะมีจำนวนเท่ากัน สำหรับตัวอย่างไบนารีทรีแบบสมบูรณ์ แสดงไว้ดังรูปที่ 7.7 (a) ในขณะที่ไบนารีทรีเกือบสมบูรณ์ก็จะเป็นไปตามสูตร Hmin หรือเป็นทรีที่มีโหนดเต็มทุกโหนด ยกเว้นในระดับโหนดสุดท้ายที่มีโหนดเฉพาะทางด้านซ้าย ซึ่งเป็นไปได้ดังรูปที่ 7.7 (b) วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202

  19. A A A B C B C D E F G (a) ไบนารีทรีแบบสมบูรณ์ A A A B C B C B C D D E D E F (b) ไบนารีทรีเกือบสมบูรณ์ รูปที่ 7.7 ไบนารีทรี วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202

  20. การแทนไบนารีทรีในหน่วยความจำ (Binary Tree Representation) ในที่นี้จะกล่าวถึงการแทนโครงสร้างไบนารีทรีในหน่วยความจำแบบหนึ่งมิติ ในกรณีที่ทรีอยู่ในรูปแบบของไบนารีทรีแบบสมบูรณ์ ก็จะลำดับข้อมูลในทรีแต่ละระดับด้วยการเรียงจากซ้ายไปขวา จากรูปที่ 7.8 เป็นตัวอย่างไบนารีทรีแบบสมบูรณ์ เมื่อนำมาแทนโครงสร้างด้วยอาร์เรย์หนึ่งมิติ ก็จะมีการลำดับตำแหน่งข้อมูลดังนี้ การแทนไบนารีทรีด้วยอาร์เรย์ วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202

  21. A B C D E F G รูปที่ 7.8 ตัวอย่างไบนารีทรีแบบสมบูรณ์ (0) (1) (2) (3) (4) (5) (6) A B C D E F G วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202

  22. อย่างไรก็ตาม ในกรณีที่ทรีนั้นเป็นไบนารีแบบไม่สมบูรณ์หรือเกือบสมบูรณ์ ลำดับตำแหน่งจะมีการจัดเรียงแตกต่างไปจากเดิม แต่ยังคงสามารถกระทำตามขั้นตอนเช่นเดิมได้ โดยแปลงไบนารีทรีที่ไม่สมบูรณ์นี้มาเป็นไบนารีทรีแบบสมบูรณ์ด้วยการเพิ่มโหนดให้เต็ม (เป็นไปตามสูตร) ซึ่งแสดงได้ดังรูปที่ 7.9 A A B C B C D E D E รูปที่ 7.9 การแปลงไบนารีทรีแบบไม่สมบูรณ์ได้ด้วยการเพิ่มโหนดว่างให้เต็มต้น (0) (1) (2) (3) (4) (5) (6) A B C D E วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202

  23. การแทนไบนารีทรีด้วยลิงก์ลิสต์การแทนไบนารีทรีด้วยลิงก์ลิสต์ การแทนโครงสร้างไบนารีทรีในหน่วยความจำแบบลิงก์ลิสต์จะช่วยแก้ปัญหาการสูญเสียพื้นที่ว่างเปล่า ในกรณีของหน่วยความจำแบบสแตติกของอาร์เรย์ได้ และด้วยลิงก์ลิสต์เป็นหน่วยความจำแบบไดนามิกนี้เอง จึงสามารถใช้หน่วยความจำได้อย่างคุ้มค่า โดยแต่ละโหนดจะประกอบด้วยข้อมูลสำคัญอยู่ 3 ฟิลด์ คือข้อมูลที่บรรจุอยู่ในโหนด และพอยน์เตอร์ที่ชี้ไปยังซับทรีด้านซ้าย กับพอยน์เตอร์ที่ชี้ไปยังซับทรีด้านขวา ซึ่งเป็นไปได้ดังรูปที่ 7.10 วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202

  24. A A B C B C D E F G D E รูปที่ 7.10 ภาพแสดงการแทนไบนารีทรีด้วยลิงก์ลิสต์ วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202

  25. การท่องเข้าไปในไบนารีทรี (Binary Tree Traversals) การท่องเข้าไปในไบนารีทรี ก็คือการเดินทางเข้าไปในทรี ซึ่งแต่ละโหนดอย่างน้อยจะถูกกระทำ 1 ครั้ง โดยตัวอย่างการกระทำเช่น การค้นหาที่จะต้องเดินทางผ่านโหนดแต่ละโหนดตามลำดับ เป็นต้น และโดยปกติวิธีการท่องเข้าไปในทรีจะมีอยู่ด้วยกัน 2 วิธีด้วยกันคือ 1. วิธีการท่องแบบแนวลึก (Depth-First) 2. วิธีการท่องแบบแนวกว้าง (Breadth-First) วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202

  26. 1. วิธีการท่องแบบแนวลึก (Depth-First Traversals) เป็นวิธีการท่องเข้าไปในทรีด้วยการเดินผ่านจากรูทโหนดลงไปยังโหนดลูกๆ ซึ่งมีทั้งฝั่งด้านซ้ายและด้านขวา ดังนั้นจึงมีการบัญญัติคำย่อเพื่อใช้งานดังนี้ N แทนรูดโหนด L แทนซับทรีด้านซ้าย R แทนซับทรีด้านขวา วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202

  27. สำหรับวิธีการท่องแบบแนวลึก จะขอกล่าวเพียง 3 วิธีการมาตรฐานที่นิยมใช้กันอย่างแพร่หลาย ซึ่งประกอบด้วยวิธี Preorder, Inorder และ Postorder 1 2 3 N N N L R L R L R 2 Left subtree 3 Right subtree 1 Left subtree 3 Right subtree 1 Left subtree 2 Right subtree (a) Preorder traversal (C) Inorder traversal (C) Postorder traversal รูปที่ 7.11 การท่องไปยังทรีแบบแนวลึกด้วยวิธีต่างๆ วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202

  28. แบบพรีออร์เดอร์ (Preorder Traversal : NLR) วิธีการท่องเข้าไปในทรีแบบ Preorder จะท่องในรูปแบบ NLR คือ จะเริ่มต้นกระทำที่รูทโหนดก่อนเป็นลำดับแรก จากนั้นก็ตามด้วยซับทรีด้านขวา โดยพิจารณาจากรูปที่ 7.12 (a) ที่แสดงถึงการท่องเข้าไปแบบ Preorder และผลลัพธ์ที่ได้ขณะที่ซูโดโค้ดของการท่องแบบ Preorder แสดงไว้ในอัลกอริทึมที่ 7.2 วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202

  29. Algorithm PreOrder (root) Traverse a binary tree in node-left-right sequence. Pre root is the entry node of a tree or subtree Post each node has been processed in order 1 if (root is not null) 1 process (root) 2 preOrder (leftSubtree) 3 preOrder (rightSubtree) 2 end if end preOrder อักอริทึมที่ 7.2 การท่องไปยังไบนารีทรีแบบ Preorder วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202

  30. แบบอินออร์เดอร์ (Inorder Traversal : LNR) วิธีการท่องเข้าไปในทรีแบบ Inorder จะท่องในรูปแบบ LNR คือ จะเริ่มต้นกระทำที่ซับทรีด้านซ้ายก่อนเป็นลำดับแรก จากนั้นก็ตามด้วยรูทโหนด และท้ายสุดก็คือซับทรีด้านขวา โดยพิจารณาจากรูปที่ 7.12 (b) ที่แสดงถึงการท่องเข้าไปแบบ Inorder และผลลัพธ์ที่ได้ขณะที่ซูโดโค้ดของการท่องแบบ Inorder แสดงไว้ในอัลกอริทึมที่ 7.3 วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202

  31. Algorithm inOrder (root) Traverse a jbinary tree in left-node-right sequence. Pre root is the entry node of a tree or subtree Post each node has been processed in order 1 if (root is not null) 1 inOrder (leftSubTree) 2 process (root) 3 inOrder (rightSubTree) 2 end if end inOrder อักอริทึมที่ 7.3 การท่องไปยังไบนารีทรีแบบ Inorder วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202

  32. แบบโพสต์ออร์เดอร์ (Postorder Traversal : LRN) วิธีการท่องเข้าไปในทรีแบบ Postorder จะท่องในรูปแบบ LRN คือ จะเริ่มต้นกระทำที่ซับทรีด้านซ้ายก่อนแล้วตามด้วยซับทรีด้านขวา ก่อน จากนั้นจบลงที่รูทโหนด โดยพิจารณาจากรูปที่ 7.12 (c) ที่แสดงถึงการท่องเข้าไปแบบ Postorder และผลลัพธ์ที่ได้ขณะที่ซูโดโค้ดของการท่องแบบ Postorder แสดงไว้ในอัลกอริทึมที่ 7.4 วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202

  33. Algorithm postOrder (root) Traverse a binary tree in left-right-node sequence. Pre root is the entry node of a tree or subtree Post each node has .been processed in order 1 if (root is not null) 1 postOrder (leftSubTree) 2 postOrder (rightSubtree) 3 process (root) 2 end if end postOrder อักอริทึมที่ 7.4 การท่องไปยังไบนารีทรีแบบ Postorder วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202

  34. Preorder order “Walking” order A A B E B E C D F C D F A B E C D F (a) วิธีการท่องแบบ Preorder รูปที่ 7.12 การท่องไปยังไบนารีทรีแบบ Depth-First ซึ่งประกอบด้วยวิธีต่างๆ และผลลัพธ์ที่ได้ วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202

  35. Inorder order “Walking” order A A B E B E C D F C D F A B E C D F (b) วิธีการท่องแบบ Inorder รูปที่ 7.12 การท่องไปยังไบนารีทรีแบบ Depth-First ซึ่งประกอบด้วยวิธีต่างๆ และผลลัพธ์ที่ได้ วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202

  36. Postorder order “Walking” order A A B E B E C D F C D F A B E C D F (c) วิธีการท่องแบบ Postorder รูปที่ 7.12 การท่องไปยังไบนารีทรีแบบ Depth-First ซึ่งประกอบด้วยวิธีต่างๆ และผลลัพธ์ที่ได้ วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202

  37. 2. วิธีการท่องแบบแนวกว้าง (Breadth-First Traversals) เป็นวิธีการท่องเข้าไปในทรีด้วยการกระทำทีละระดับจากบนลงล่าง โดยเริ่มต้นจากรูทโหนด แล้วจึงค่อยเข้าถึงแต่ละโหนดในแต่ละระดับตามแนวกว้างจากซ้ายไปขวา จนกระทั่งครบทุกระดับ ซึ่งตัวอย่างการทำงานได้ดังรูปที่ 7.13 วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202

  38. Preorder order “Walking” order A A B B B B C D D C D D A B E C D F รูปที่ 7.13 การท่องไปยังไบนารีทรีด้วยวิธี Breadth-First Traversals วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202

  39. สำหรับการท่องเข้าไปในทรีด้วยวิธี (Depth-First) นั้นจะใช้สแต็ก ซึ่งทราบกันดีแล้วว่า การเรียกซ้ำหรือรีเคอร์ชันนั้นจะใช้โครงสร้างข้อมูลสแต็กช่วยในการทำงาน ในขณะที่การท่องไปยังทรีแบบ (Breath-First) นั้นจะใช้โครงสร้างคิว โดยซูโดโค้ดสำหรับการท่องเข้าไปในไบนารีทรีด้วยวิธี Breath-First แสดงไว้ในอัลกอริทึมที่ 7.13 วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202

  40. Algorithm breadthFirst (root) Process tree using breadth-first traversal, Pre root is node to be processed Post tree has been processed 1 set currentNode to root 2 createQueue (bfQueue) 3 loop (currentNode not null) 1 process (currentNode) 2 if (left subtree not null) 1 enqueue (bfQueue, leftsubtree) 3 end if 4 if (right subtree not null) 1 enqueue (bf Queue, right-Subtree) 5 end if 6 if (not emptyQueue(bfQueue)) 1 set currentNode to dequeue (bfQueue) 7 else 1 set currentNode to null 8 end if 4 end loop 5 destroyQueue (bfQueue) end breadthFirst อักอริทึมที่ 7.5 การท่องไปยังไบนารีทรีแบบ Breath-First วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202

  41. เอ็กซ์เพรสชันทรี (Expression Tree Traversals) เอ็กซ์เพรสชันทรีคือไบนารีทรี ซึ่งการแทนนิพจน์ในเอ็กซ์เพรสชันทรีนั้น จะต้องเป็นไปตามคุณสมบัติดังต่อไปนี้ 1. ตัวดำเนินการหรือโอเปอแรนด์จะเก็บไว้ในโหนดใบ (Leaf Node) 2. ตัวดำเนินการหรือโอเปอเรเตอร์จะเก็บไว้ที่รูทโหนดภายใน (Internal Node) ที่ไม่ใช้โหนดใบ 3. ซับทรี ในที่นี้คือนิพจน์ย่อย โดยจะมีรูทโหนดเป็นตัวโอเปอเรเตอร์ วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202

  42. จากตัวอย่างดังรูปที่ 7.14 ซึ่งเป็นนิพจน์เดียวกัน แต่นำเสนอทั้งในรูปแบบของนิพจน์แบบ Infix และ เอ็กซ์เพรสชันทรี + * a a * (b + c) + d + a b b รูปที่ 7.14 นิพจน์เดียวกันที่นำเสนอในรูปแบบนิพจน์ Infix และเอ็กซ์เพรสชันทรี วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202

  43. จากหลักความรู้เกี่ยวกับการท่องไปยังไบนารีทรี ด้วยวิธีการท่องแบบแนวลึกที่ประกอบไปด้วย 3 วิธีมาตรฐานนี้เอง จึงเป็นที่มาของการนำไปประยุกต์ใช้งานเอ็กซ์เพรสชันทรี โดยที่ 1. เอ็กซ์เพรสชันทรีแบบ Infix จะใช้วิธีการท่องเข้าไปในทรีแบบ Inorder 2. เอ็กซ์เพรสชันทรีแบบ Postfix จะใช้วิธีการท่องเข้าไปในทรีแบบ Postorder 3. เอ็กซ์เพรสชันทรีแบบ Prefix จะใช้วิธีการท่องเข้าไปในทรีแบบ Preorder วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202

  44. การท่องเข้าไปในเอ็กซ์เพรสชันทรีแบบ Infix สำหรับตัวอย่างการท่องไปยังเอ็กซ์เพรสชันทรีแบบ Infix ในที่นี้จะเขียนอัลกอริทึม และทำการพิมพ์นิพจน์ออกมาดังรูปที่ 7.15 เมื่อมีการท่องเพื่อพิมพ์นิพจน์ในรูปแบบ Infix จะต้องเพิ่มเครื่องหมายวงเล็บเปิดที่จุดเริ่มต้นของแต่ละนิพจน์ และจะปิดด้วยเครื่องหมายวงเล็บปิดที่ส่วนปลายของนิพจน์นั้นที่ได้ก็คือ สำหรับซูโดโค้ดของเอ็กซ์เพรสชันทรี Infix แสดงไว้ในอัลกอริทึมที่ 7.6 (( a * (b + c) + d) วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202

  45. + ( ) * ( ) a (( a * (b + c) + d) + a ( ) b b รูปที่ 7.15 การท่องแบบ Infix ในเอ็กซ์เพรสชันทรี วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202

  46. Algorithm infix (tree) Print the infix expression for an expression tree. Pre tree is a pointer to an expression tree Post the infix expression has been printed 1 if (tree not empty) 1 if (tree token is an operand) 1 print (tree-token) 2 else 1 print (open parenthesis) 2 infix (tree left subtree) 3 print (tree token) 4 infix (tree right subtree) 5 print (close parenthesis) 3 end if 2 end if end infix อักอริทึมที่ 7.6 การท่องไปยังในเอ็กซ์เพรสชันทรีแบบ Infix วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202

  47. การท่องเข้าไปในเอ็กซ์เพรสชันทรีแบบ Postfix การท่องแบบ Postfix ในที่เอ็กซ์เพรสชันทรี จะใช้หลักการเดียวกับ Postorder ในไบนารีทรี ซึ่งไม่มีความจำเป็นต้องใช้เครื่องหมายวงเล็บแต่อย่างใด ผลลัพธ์จากการท่องเข้าไปในเอ็กซ์เพรสชันทรีดังรูปที่ 7.15 ก็จะได้นิพจน์ดังนี้ สำหรับซูโดโค้ดของการท่องเข้าไปในเอ็กซ์เพรสชันทรีแบบ Postfix แสดงไว้ในอัลกอริทึมที่ 7.7 a b c + * d + วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202

  48. Algorithm postfix (tree) Print the postfix expression for an expression tree. Pre tree is a pointer to an egression tree Post the postfix expression has been printed 1 if (tree not empty) 1 postfix (tree left subtree) 2 postfix (tree right subtree) 3 print (tree token) 2 end if end postfix อักอริทึมที่ 7.7 การท่องไปยังในเอ็กซ์เพรสชันทรีแบบ Postfix วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202

  49. การท่องเข้าไปในเอ็กซ์เพรสชันทรีแบบ Prefix การท่องแบบ Prefix ในที่เอ็กซ์เพรสชันทรี จะใช้หลักการเดียวกับ Preorder ในไบนารีทรี ซึ่งไม่มีความจำเป็นต้องใช้เครื่องหมายวงเล็บแต่อย่างใด ผลลัพธ์จากการท่องเข้าไปในเอ็กซ์เพรสชันทรีดังรูปที่ 7.15 ก็จะได้นิพจน์ดังนี้ สำหรับซูโดโค้ดของการท่องเข้าไปในเอ็กซ์เพรสชันทรีแบบ Prefix แสดงไว้ในอัลกอริทึมที่ 7.8 + * a + b c d วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202

  50. Algorithm prefix (tree) Print the prefix expression for an expression tree. Pre tree is a pointer to an expression tree Post the prefix expression has been printed 1 if (tree not empty) 1 print (tree token) 2 prefix (tree left subtree) 3 prefix (tree right subtree) 2 end if end prefix อักอริทึมที่ 7.8 การท่องไปยังในเอ็กซ์เพรสชันทรีแบบ Prefix วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202

More Related