470 likes | 950 Views
โครงสร้างข้อมูลแบบต้นไม้ (Tree). Tree. หมายถึง โครงสร้างข้อมูลที่ออกแบบมาให้มีลักษณะไม่เป็นเชิงเส้น มีการจัดเก็บข้อมูลเชื่อมโยงกันเป็นระดับชั้น โดยเริ่มจากโหนดแรกที่อยู่บนสุดเรียกว่า Root Node เชื่อมโยงไปยังโหนดระดับรองลงไป แต่ละระดับก็มีการเชื่อมโยงโหนดระดับต่อไป ซึ่งเรียกว่า Subtree.
E N D
โครงสร้างข้อมูลแบบต้นไม้(Tree)โครงสร้างข้อมูลแบบต้นไม้(Tree)
Tree • หมายถึง โครงสร้างข้อมูลที่ออกแบบมาให้มีลักษณะไม่เป็นเชิงเส้น มีการจัดเก็บข้อมูลเชื่อมโยงกันเป็นระดับชั้น โดยเริ่มจากโหนดแรกที่อยู่บนสุดเรียกว่า Root Node เชื่อมโยงไปยังโหนดระดับรองลงไป แต่ละระดับก็มีการเชื่อมโยงโหนดระดับต่อไป ซึ่งเรียกว่า Subtree
นิยามของโครงสร้างต้นไม้นิยามของโครงสร้างต้นไม้ • โครงสร้างข้อมูลแบบต้นไม้ มีคุณสมบัติดังนี้ 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 • ImmediateSuccessor คือโหนดทั้งหลายของต้นไม้ย่อย i ที่มีค่าระดับต่ำกว่าโหนด i อยู่หนึ่ง เช่น SON ของโหนด H คือโหนด E, I, และ F
Immediate Predecessor หรือ father ของโหนด i • Immediate Predecessor คือโหนดที่มีค่าระดับสูงกว่าโหนด i อยู่หนึ่ง เช่น FATHER ของโหนด J คือโหนด I, FATHER ของโหนด I คือโหนด H เป็นต้น
โครงสร้างต้นไม้ (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) ตามลำดับคำว่า ว่างเปล่า ในนิยามหมายความว่า ต้นไม้ไบนารีต้นนั้นมีแต่รูตโหนดเพียงโหนดเดียวเท่านั้น
A C S V B C G F D D E F G (ข) X (ก) (ค) รูป (ก), (ข) และ (ค) เป็นต้นไม้ไบนารี
(ง) (ฉ) (จ) รูป (ง), (จ) และ (ฉ)ไม่ใช่ต้นไม้ไบนารี
ต้นไม้ไบนารีแบบสมบูรณ์ (Complete Binary Tree) • ต้นไม้ไบนารีแบบสมบูรณ์ หมายถึงต้นไม้ไบนารีที่แต่ละโหนดภายในมีโหนดย่อยซ้ายและขวา (นั่นคือแต่ละโหนดภายในมี left son และ right son ) และโหนดใบ (leaf nodes) ทั้งหลายอยู่ในระดับที่ n รูป (ก) เป็นต้นไม้ไบนารีแบบสมบูรณ์ที่มี 3 ระดับ D R K M W O U (ก)
ต้นไม้ไบนารีแบบสมบูรณ์ที่มีโหนดใบอยู่ที่ระดับ n จะมีโหนดทั้งหมดเท่ากับ 2n-1 W V D N S A Q จากรูป จำนวนโหนดเท่ากับ 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
การท่องต้นไม้ (Tree Traversal) Tree Traversalหมายถึงการไปยังโหนดเพื่อประมวลผลบางอย่างที่ต้องการกระทำกับโหนดนั้น เช่น หาข่าวสาร แบ่งออกเป็น 3 วิธี (ที่นิยมใช้) 1. Pre-Order Traversal (RTLTR) 2. In-Order Traversal (TLRTR) 3. Post-Order Traversal (TLTRR)
การท่องผ่าน 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
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
A B C D E F G H I Pre-order : ABDGCEHIF In-order : DGBAHEICF Post- order :GDBHIEFCA
EX1 + - A * D B C จงท่องเข้าไปในต้นไม้ แบบ 1.Pre-order2.In-order 3.Post-order
Expression Tree เป็นต้นไม้แบบไบนารีที่ โหนดใบคือoperands, เช่นค่าคงที่หรือตัวแปร, และโหนดรากคือoperators จากรูปแสดง Expression tree ของ (a + b * c) + ((d * e + f ) * g)
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
การสร้าง Expression Tree • อ่านสัญลักษณ์จากนิพจน์ที่ละตัวถ้าตัวที่อ่านมาเป็น operand ให้สร้างโหนดของ tree หนึ่งโหนดแล้ว push มันลงใน stack ถ้าตัวที่อ่านมาเป็น operator ให้ pop จาก stack 2 ครั้ง ซึ่งจะได้ trees T1และT2 (T1นำออกก่อน) แล้วให้นำมาสร้างเป็น tree ใหม่ที่มีราก (root) เป็นตัว operator และมี left และ right children เป็นT2และT1ตามลำดับจากนั้นให้ใส่ tree ใหม่นี้กลับลง stack
1 • ถ้าอินพุต คือ a b + c d e + * * 2 3
แบบฝึกหัด 1. จากต้นไม้ไบนารีที่กำหนด ให้เขียนผลลัพธ์จากการท่องเข้าไปในต้นไม้ แบบPreorder ,Inorder , Postorder A H B J F G I D K M 2. จงสร้าง Expression Treeจากนิพจน์ต่อไปนี้ 2.1(A - 2 * (B + C) – D * E) * F 2.2 A + (B – C) * D ^ ( E * F )
แบบฝึกหัด • 3. จงแปลงทรีให้เป็นไบนารีทรี A H B C J F G I D E K M