600 likes | 1.71k Views
โครงสร้างข้อมูลแบบต้นไม้ (Tree). โครงสร้างต้นไม้ (Tree Structure). นิยามโครงสร้างต้นไม้ (Tree) เป็นโครงสร้างชนิด ไม่เชิงเส้น (Non-linear) มีลักษณะเป็นรีเคอร์ซีฟ - Tree เป็นกลุ่มของโหนดที่มีสมาชิกหนึ่งโหนด หรือมากกว่า โดยที่ - มีโหนดพิเศษโหนดหนึ่งเรียกว่า Root Node
E N D
โครงสร้างข้อมูลแบบต้นไม้(Tree)โครงสร้างข้อมูลแบบต้นไม้(Tree)
โครงสร้างต้นไม้ (Tree Structure) นิยามโครงสร้างต้นไม้ (Tree)เป็นโครงสร้างชนิด ไม่เชิงเส้น (Non-linear) มีลักษณะเป็นรีเคอร์ซีฟ - Tree เป็นกลุ่มของโหนดที่มีสมาชิกหนึ่งโหนด หรือมากกว่า โดยที่ - มีโหนดพิเศษโหนดหนึ่งเรียกว่า Root Node - โหนดอื่นๆ จะถูกแบ่งออกเป็นเซตที่ไม่มี สมาชิกร่วมกันซึ่งแต่ละเซตจะมีโครงสร้างเป็น Tree ที่เรียกว่า Subtree ของ Root Node
ลักษณะต้นไม้แบบรีเคอร์ซีฟลักษณะต้นไม้แบบรีเคอร์ซีฟ จากรูป R เป็นรูตของต้นไม้ย่อย A,B,C,D A เป็นรูตของต้นไม้ย่อย E,F,G F เป็นรูตของต้นไม้ย่อย J B เป็นรูตของต้นไม้ย่อย H และ I
โครงสร้างต้นไม้ (Tree Structure) R Root Nodes Nodes X เป็น Immediate Predecessor ของ Y หรือ X เป็น Father (Parent) ของ Y A B X C D H Y Nodes Y เป็น Immediate Successor ของ X หรือ Y เป็น son (Child) ของ X E I G Leaf Nodes
R Root Nodes Level 0 A B X Level 1 C D H Y Level 2 E I G Leaf Nodes Level 3 โครงสร้างต้นไม้ (Tree Structure) Levelแสดงถึงหน่วยระยะทางตามแนวดิ่งของโหนดว่าอยู่ห่างจาก Root Node เป็นระยะเท่าไรและทุกกิ่งมีความยาวเท่ากันคือ 1 หน่วย
R Root Nodes Level 0 A B X Level 1 C D H Y Level 2 E I G Leaf Nodes Level 3 โครงสร้างต้นไม้ (Tree Structure) Degreeแสดงถึงจำนวนของ Subtree ของโหนดนั้น เช่น A มี Degree 2, X มี Degree 1
R Root Nodes Level 0 A B X Level 1 C D H Y Level 2 E I G Leaf Nodes Level 3 โครงสร้างต้นไม้ (Tree Structure) Leaf Nodeแสดงถึงโหนดที่มี Degree = 0 เช่น C, D, E, I ,G ส่วนโหนด ที่มี Degree <> 0 เรียกว่า Branch Node หรือ Interior Node
R A B X C D H Y E I G โครงสร้างต้นไม้ (Tree Structure) Nodes X เป็น Immediate Predecessor ของ Y หรือ X เป็น Father (Parent) ของ Y Nodes Y เป็น Immediate Successor ของ X หรือ Y เป็น son (Child) ของ X Predecessor หมายถึง ตัว Node ที่อยู่ก่อนหน้า Successor หมายถึง ตัว Node ที่มาที่หลัง เช่น R, B, H เป็น Predecessor ของ E, I, I เป็น Successor ของ 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 - - - - - - - รูปการแทนต้นไม้โดยใช้อาร์เรย์ ถ้าพิจาณาโหนดใดๆ เป็นตำแหน่ง x โหนดลูกทางซ้ายจะมีดัชนี 2x ส่วนโหนดลูกทางขวาจะมีดัชนี 2x+1
การเปลี่ยน 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
การท่องต้นไม้ (Tree Traversal) Tree Traversalหมายถึงการไปยังโหนดเพื่อประมวลผลบางอย่างที่ต้องการกระทำกับโหนดนั้น เช่น หาข่าวสาร แบ่งออกเป็น 3 วิธี (ที่นิยมใช้) 1. Pre-Order Traversal (RTLTR) 2. In-Order Traversal (TLRTR) 3. Post-Order Traversal (TLTRR) reverse Pre-Order Traversal (RTRTL) reverse In-Order Traversal (TRRTL) reverse Post-Order Traversal (TRTLR)
R A X C D G การท่องต้นไม้ไบนารี (Binary Tree Traversal) start stop แบบ Pre-Order Traversal Y Result R A C D X Y G
R A X C D G การท่องต้นไม้ไบนารี (Binary Tree Traversal) start stop แบบ In-Order Traversal Y Result C A D R G Y X
R A X C D G การท่องต้นไม้ไบนารี (Binary Tree Traversal) start stop แบบ Post-Order Traversal Y Result C D A G Y X R
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
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 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 (ดัชนีปัจจุบันเป็น x ดังนั้นลูกทางซ้ายจะมีดัชนี 2x และลูกทางขวาจะมีดัชนี 2x+1 สำหรับอาเรย์) 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โหนด
AVL Trees • AVL (Adelson-Velskii and Landis) tree เป็น binary search tree กำกับด้วยเงื่อนไขของการสมดุลและประกันว่า depth ของ tree จะเป็นO(log n) • อย่างง่ายที่สุดคือกำหนดว่า left และ right subtrees มี height เท่ากันซึ่งไม่ทำให้ tree ตื้นได้ • เงื่อนไขการสมดุลอีกอย่าง คือ ทุกโหนดจะต้องมี left และ right subtrees ที่มี height เท่ากัน • ถ้ากำหนดให้ height ของ empty subtree เป็น -1 (ใช้กันทั่วไป) แล้ว จะมีก็แต่เฉพาะ tree ที่เป็น perfect balanced (มี2n - 1 โหนด) เท่านั้นที่เป็นไปตามข้อกำหนดนี้เงื่อนไขการสมดุลนี้เข้มงวดเกินไปจนอาจใช้ประโยชน์ได้ไม่ดี
AVL Trees A bad binary tree. Requiring balance at the root is not enough.
โครงสร้างข้อมูลแบบ Tree • ต้นไม้เอวีแอล (AVL Tree) เป็นไบนารีเซิร์ซเทรีแบบต้นไม้ไบนารีสมดุล: ถ้า T คือต้นไม้ใดๆ และ N คือโหนดใดๆ บนต้นไม้ T แล้ว ความแตกต่างระหว่างความสูงของต้นไม้ยอ่ย (Sub Tree) ที่อยู่ทางขวา และทางซ้าย ของ N จะถูกเรียกว่า บาลานซ์แฟคเตอร์ (Balance Factor) และต้นไม้ T จะถูกเรียกว่าต้นไม้สมดุล เมื่อบาลานซ์แฟคเตอร์ของ N ใดๆ ต้องมีค่าไม่เกิน |1| (ต้องมีค่าเป็น -1 หรือ 0 หรือ 1)
1 3 2 1 AVL Non-AVL ต้นไม้เอวีแอล (AVL Tree) น้ำหนักความสูงของ node = ความสูง Subtree(ซ้าย) - ความสูง Subtree(ขวา)
ต้นไม้เอวีแอล (AVL Tree) • AVL TREE เมื่อมี Tree ที่ไม่สมดุลจะเกิดการหมุนเพื่อให้สมดุลซึ่งมี 4 วิธี 1. การหมุนซ้าย : โหนดทางขวามากกว่าซ้าย ยกโหนดที่อยู่ขวาขึ้นมา 2. การหมุนขวา : โหนดทางซ้ายมากกว่าขวา ยกโหนดที่อยู่ซ้ายขึ้นมา 3. การหมุนขวาไปซ้าย : หมุนขวาก่อน แล้วค่อยหมุนซ้าย 4. การหมุนซ้ายไปขวา : หมุนซ้ายก่อน แล้วค่อยหมุนขวา
ต้นไม้เอวีแอล (AVL Tree) - การหมุนซ้าย • การหมุนซ้าย 0 -2 7 5 0 0 -1 5 8 7 0 8 ไม่สมดุล สมดุล
ต้นไม้เอวีแอล (AVL Tree) - การหมุนขวา • การหมุนขวา
ต้นไม้เอวีแอล (AVL Tree) - การหมุนขวาไปซ้าย หมุนซ้ายครั้งที่ 2 หมุนขวาครั้งแรก
ต้นไม้เอวีแอล (AVL Tree) - การหมุนซ้ายไปขวา หมุนขวาครั้งที่ 2 หมุนซ้ายครั้งแรก
การลบ node ใน AVL TREE • ถ้าลบโหนดออกไปแล้วเกิดเสียสมดุล ก็ทำให้ต้นไม้สมดุล โดยการหมุน เมื่อลบ node 4 เมื่อลบ node 2
การลบ node ใน AVL TREE • เมื่อไม่สมดุล ก็หมุนให้สมดุล จะได้เป็น
A B D C G H E F K L I J แบบฝึกหัด 1. จากต้นไม้ไบนารีที่กำหนด ให้เขียนผลลัพธ์จากการท่องเข้าไปในต้นไม้ แบบPreorder ,Inorder , Postorder 2. จงสร้าง Expression Treeจากนิพจน์ต่อไปนี้ 2.1(A - 2 * (B + C) – D * E) * F 2.2 A + (B – C) * D ^ ( E * F )
แบบฝึกหัด (ต่อ) 1. จงสร้าง Binary Search Tree จากข้อมูลดังนี้ 10, 8, 2, 4, 3, 15, 26, 30 ,17, 6 2. จงปรับทรีต่อไปนี้ให้เป็น AVL Treeหลังจากเพิ่มโหนด 15, 20, 30 0 -2 -1 0 -1