590 likes | 1.05k Views
Expression Tree Binary Tree Search. Expression Tree เอ็กซ์ เพรส ชันท รี คือ อะไร. เอ็กซ์ เพรส ชันท รี เป็นการประยุกต์การใช้งาน จากไบนารีท รี มีหลักการทำงาน เหมือนไบนารีท รีแต่ เอ็กซ์ เพรส ชันท รีจะใช้เก็บนิพจน์ทางคณิตศาสตร์ โดย เอ็กซ์ เพรส ชันท รีมีข้อมูลด้วยกัน 2 ชนิด คือ
E N D
Expression Treeเอ็กซ์เพรสชันทรี คือ อะไร เอ็กซ์เพรสชันทรี เป็นการประยุกต์การใช้งานจากไบนารีทรี มีหลักการทำงานเหมือนไบนารีทรีแต่เอ็กซ์เพรสชันทรีจะใช้เก็บนิพจน์ทางคณิตศาสตร์ โดยเอ็กซ์เพรสชันทรีมีข้อมูลด้วยกัน 2 ชนิด คือ Operand Operator (โอเปอร์แรนด์) (โอเปอร์เรเตอร์)
Expression Treeข้อมูลใน เอ็กซ์เพรสชันทรี รู้จักข้อมูลทั้ง 2 ชนิด โอเปอร์แรนด์ คือ ตัวถูกดำเนินการ(ตัวแปรหรือค่าคงที) เช่น A B C D หรือ 1 3 5 7 โอเปอร์เรเตอร์คือ เครื่องหมายการคำนวณต่างๆ เช่น เช่น + - * /
Expression Treeคุณลักษณ์ของ เอ็กซ์เพรสชันทรี 1 โอเปอร์แรนด์ จะถูกเก็บไว้ที่โหนดใบ 2 โอเปอร์เรเตอร์ จะถูกเก็บไว้ที่รูทโหนด หรือโหนดอื่นที่ไม่ใช้โหนดใบ 3 ซับทรี จะมีรูทโหนดเป็นตัวโอเปอร์เรเตอร์
Expression Treeคุณลักษณ์ของ เอ็กซ์เพรสชันทรี โอเปอร์แรนด์ จะถูกเก็บไว้ที่โหนดใบ + โอเปอร์แรนด์ * D A + B C
Expression Treeคุณลักษณ์ของ เอ็กซ์เพรสชันทรี โอเปอร์เรเตอร์ จะถูกเก็บไว้ที่รูทโหนด หรือ โหนดอื่นที่ไม่ใช้โหนดใบ + * โอเปอร์เร เตอร์ D A + B C
Expression Treeคุณลักษณ์ของ เอ็กซ์เพรสชันทรี ซับทรี จะมีรูทโหนดเป็นตัวโอเปอร์เรเตอร์ + จะมีรูทโหนดเป็นเครื่องหมาย * D A + B C
Expression Treeการท่องไปใน เอ็กซ์เพรสชันทรี จะใช้วิธีเดียวกันกับการท่องในไบนารีทรี แต่จะเรียกต่างกัน 1. ในเอ็กซ์เพรสชันทรี Prefix ในไบนารีทรี เรียก Preorder = NLR 2. ในเอ็กซ์เพรสชันทรี Infixในไบนารีทรี เรียกInorder = LNR 3. ในเอ็กซ์เพรสชันทรี Postfix ในไบนารีทรีเรียก Postorder = LRN * N คือ รากโหนด หรือ รูทโหนด(Root Node)
Expression Tree การท่องเอ็กซ์เพรสชันทรีแบบ Prefix + Prefix = NLR + + * C A B D * D A + B C
Expression Tree การท่องเอ็กซ์เพรสชันทรีแบบ Postfix + Postfix = LRN + + * A B C D * D A + B C
Expression Tree การท่องเอ็กซ์เพรสชันทรีแบบ Infix + Infix = LNR + + A * ) ( ( ( B C ) ) D * D A + B C
แบบทดสอบ Expression Tree + - / D * E A B C
การประยุกต์ใช้งาน Binary Treeต้นไม้ของนิพจน์ทางคณิตศาสตร์ (Expression Tree) • เราสามารถแทนนิพจน์ทางคณิตศาสตร์ด้วยโครงสร้างข้อมูลแบบต้นไม้ได้ เช่นแทน ((A*B) + C) + ((D + (E / F)) - G)
ต้นไม้ของนิพจน์ทางคณิตศาสตร์ (Expression Tree) • โหนดใบ (Leave) ของ Expression Tree คือ Operands (ตัวถูกดำเนินการ) ได้แก่ค่าคงที่ (Constant) หรือตัวแปร (Variable) • โหนดอื่นๆบรรจุ Operators (ตัวดำเนินการ)
การคำนวณหาค่าของ Expression Tree หาค่าของ Infix expression (อาจรวมวงเล็บด้วย) ได้โดย • หาค่าของนิพจน์ทางคณิตศาสตร์ (Expression) พร้อมวงเล็บ ของ subtree หรือ tree ทางด้านซ้ายด้วยวิธีแบบ recursive • แสดงค่า Operator ที่ Root ของ subtree/tree ออกมา • หาค่าของนิพจน์ทางคณิตศาสตร์ (Expression) พร้อมวงเล็บ ของ subtree หรือ tree ทางด้านขวาด้วยวิธีแบบ recursive • วิธีการที่กระทำการบนสมาชิกทางด้านซ้ายของโหนดก่อนตัวโหนด แล้วตามการกระทำบนสมาชิกทางด้านขวาของโหนด(Left, Node, Right) นี้เรียกว่า Inorder Traversal
การคำนวณหาค่าของ Expression Tree InorderTraversal (Left, Node, Right) • ให้ InfixExpression((A*B)+C)+((D+(E/F))-G) PostorderTraversal (Left, Right, Node) • ให้ PostfixExpressionAB*C+DEF/+G-+ PreorderTraversal (Node, Left, Right) • ให้ PrefixExpression ++*ABC-+D/EFG
การคำนวณหาค่าของ Expression Tree InfixExpression PostfixExpression PrefixExpression (A + (B/C)) + ((D*E)+((F-G)*H)) A B C / + D E * F G – H * + + + + A / B C + * D E * - F G H
Expression Tree การแปลงนิพจน์ Infix เป็น Postfix การแปลงนิพจน์ Infix เป็น Postfix จะใช้ วิธีการเรียงลำดับแบบ สแต็ก
การสร้างต้นไม้ของนิพจน์ทางคณิตศาสตร์ การเปลี่ยน Postfix Expression เป็น Expression Tree • อ่านนิพจน์ทางคณิตศาสตร์ (Expression) เข้ามาทีละตัว • ถ้าอักษรที่ได้เป็น Operand (ตัวถูกดำเนินการ) ให้สร้างต้นไม้ขนาด 1 โหนด แล้ว pushพอยน์เตอร์ 1 อันลงบนสแตก • ถ้าอักษรที่ได้เป็น Operator (ตัวดำเนินการ) ให้ popพอยน์เตอร์ไปยังต้นไม้ 2 อันคือ T1 และ T2 ออกมาจากสแตกแล้วสร้างต้นไม้ใหม่ขึ้นหนึ่งอันให้มี Root อยู่ที่ Operator ที่รับเข้ามาและมี Child ด้านซ้ายและด้านขวา เป็น T1 และ T2 ตามลำดับ • พอยน์เตอร์ที่ชี้ไปยังต้นไม้ที่สร้างขึ้นมาใหม่นี้ จะถูก Push ลงไปบนสแตก
Expression Tree การแปลงนิพจน์ Postfix เป็น ต้นไม้ จะมีหลักด้วยกัน 2 อย่างคือ 1. เจอโอเปอร์แรนด์ ให้ทำการ Push 2. เจอโอเปอร์เรเตอร์ ให้ pop ข้อมูลออก2ตำแหน่ง
Inputa b + c d e + * * a b + c d e + * * • Input 2 ตัวแรกเป็น Operand จึงสร้างต้นไม้ขนาด 1 โหนดแล้ว pushพอยน์เตอร์ 1 อันลงบนสแตก a b + c d e + * * • อ่าน + เข้ามา จึง popพอยน์เตอร์ออกมาจากสแตก สร้างต้นไม้ใหม่ Pushพอยน์เตอร์ที่ชี้ไปยังต้นไม้ที่สร้างขึ้นมาใหม่ลงไปบนสแตก
a b + c d e + * * • อ่าน c, d, e เข้ามา สร้างต้นไม้ขนาด 1 โหนด สำหรับอักษรแต่ละตัว แล้ว Push พอยน์เตอร์ที่ชี้ไปยังต้นไม้ แต่ละอันนี้ลงบนสแตก a b + c d e + * * • อ่าน + เข้ามา จึง popพอยน์เตอร์ออกมาจากสแตก สร้างต้นไม้ใหม่ Pushพอยน์เตอร์ที่ชี้ไปยังต้นไม้ที่สร้างขึ้นมาใหม่ลงไปบนสแตก
a b + c d e + * * • อ่าน * เข้ามา จึงทำการ Popพอยน์เตอร์ออกมาจากสแตก แล้วสร้างต้นไม้ใหม่โดยมี * ที่อ่านเข้ามาเป็น Root a b + c d e + * * • อ่าน * เข้ามา ทำการ Pop พอยน์เตอร์ออกมาจากสแตก แล้วสร้างต้นไม้ใหม่โดยมี * ที่อ่านเข้ามาเป็น Root
+ C D E + * * A B A B
C D E + * * + A + B
C D E + * * + C D E A B
* * + + C D + E A B
* * * + C + A B D E
* * * C + + D E A B
แบบฝึกหัด • 1. จงสร้าง Expression Treeจากนิพจน์ต่อไปนี้ • 1.1((A – 2) * (B + C)) – ((D * E) * F) • 1.2 A + (B – C) * D ^ ( E * F ) • 2. จงแปลง Postfix เป็น ต้นไม้ • 2.1) 6 2 * 3 / • 2.2) A 2 ^ 2 A * B * - B 2 ^ + A B - /
Binary search tree • ไบนารีเซิร์ชทรี (Binary Search Tree)เป็นไบนารีทรีที่มีคุณสมบัติที่ว่าทุก ๆ โหนดในทรี ค่าของโหนดรากมีค่ามากกว่าค่าของทุกโหนดในทรีย่อยทางซ้าย และมีค่าน้อยกว่าหรือเท่ากับค่าของทุกโหนดในทรีย่อยทางขวาและในแต่ละทรีย่อยก็มี คุณสมบัติเช่นเดียวกัน
Binary search tree • ไบนารีเสิร์ชทรีประกอบด้วยคุณสมบัติดังต่อนี้ • 1. ทุกๆ โหนดในซับทรีด้านซ้ายต้องมีค่าน้อยกว่ารูทโหนด • 2. ทุกๆ โหนดในซับทรีข้างขวาต้องมีค่ามากกว่าหรือเท่ากับรูทโหนด • 3. แต่ละซับทรีจะต้องเป็นไบนารีเสิร์ชทรี
Binary search tree • ในการสร้าง และแทรกโหนดใหม่เข้าใน Binary Search Tree เป็นกระบวนการทำงานที่ไม่สลับซับซ้อนมากนัก เพราะจะเริ่มต้นจากตำแหน่งของ Root Node หลังจากนั้นเมื่อมีโหนดใหม่ๆ เพิ่มเข้ามา ก็จะทำการเปรียบเทียบว่าค่าของโหนดใหม่ มีค่ามากว่า หรือ น้อยกว่าโหนดปัจจุบัน
Binary search tree • ถ้าค่าของโหนดใหม่น้อยกว่าค่าของโหนดปัจจุบัน ก็จะทำการค้นหาข้อมูลต่อไป ทางซ้ายตามลำดับ จนกว่าจะเจอที่ว่างๆ จึงทำการแทรกค่าโหนดใหม่ลง ณ ตรงจุดนั้น และในทางกลับกัน ถ้าค่าของโหนดใหม่ที่ค่ามากกว่าค่าของโหนดปัจจุบัน ก็จะทำการค้นหาข้อมูลต่อไปทางขวาจนกว่าจะเจอที่ว่างที่จะทำการแทรกโหนดใหม่ลงไป ณ ตรงจุดนั้น
Binary search tree • ตัวอย่างจงสร้างและแทรกข้อมูลลงใน Tree โดยอาศัยข้อมูลดังต่อไปนี้ 40, 20, 10, 50, 65, 45, 30 • เริ่มแรกด้วยการสร้างโหนดแรก ใน Tree ซึ่งข้อมูลแรกสุด คือ 40 และจะเป็นข้อมูลที่เป็น Root Node 40 null null
Binary search tree • ส่วนโหนดถัดมา คือ 20 เมื่อเปรียบเทียบค่าข้อมูลกับ Root node แล้วมีค่าน้อยกว่า 40 ก็จะทำการแทรกลงมาทางด้านซ้ายของโหนด40 40 40 null 20 null null
Binary search tree • โหนดต่อไป คือ 10 เปรียบเทียบ แล้วมีค่าน้อยกว่า 40 จึงต้องนำไปเปรียบเทียบกับโหนดถัดไปทางด้านซ้ายในที่นี้ คือ 20 และ 10 นี้มีค่าน้อยกว่า 20 ดังนั้นจึงทำการแทรกลงทางด้านซ้ายของโหนด20 40 40 null 20 null 10 null null
Binary search tree • โหนดต่อไป คือ 50 เปรียบเทียบ แล้วมีค่ามากกว่า 40 จึงทำการแทรกลงทางด้านขวาของ Tree 40 เนื่องจากทางด้านขวาของ 40 ยังไม่มีข้อมูล 40 50 20 null null null 10 null null
Binary search tree • ถัดไปคือ 65 เปรียบเทียบแล้วมีค่า มากกว่า 40 จึงต้องนำไปเปรียบเทียบกับ โหนดถัดไปทางด้านขวาในที่นี้ คือ 50 และ 65 นี้ทีค่ามากกว่า 50 ฉะนั้นจึงทำการแทรกลงทางด้านขวาของ Tree 50 เนื่องจากทางด้านขวาของ 50 ยังไม่มีข้อมูล 40 50 20 65 10 null null null null null null
Binary search tree • ถัดไปคือ 45 เปรียบเทียบ แล้วมีค่ามากกว่า 40 จึงต้องนำไปเปรียบเทียบกับโหนดถัดไปทางด้านขวาในที่นี้ คือ 50 และ 45 นี้มีค่าน้อยกว่า 50 ฉะนั้นจึงทำการแทรกลงทางด้านซ้ายของ Tree 50 เนื่องจากทางด้านซ้ายของ 50 ยังไม่มีข้อมูล 40 50 20 65 10 45 null null null null null null null
Binary search tree • ท้ายสุดคือ 30 เปรียบเทียบแล้วมีค่าน้อยกว่า 40 จึงต้องนำไปเปรียบเทียบกับโหนดถัดไป ทางด้านซ้ายในที่นี้คือ 20 และ 30 นี้มีค่ามากกว่า 20 ฉะนั้น จึงทำการแทรกลงทางด้านขวาของ Tree 20 เนื่องจากทางด้านขวาของ 20 ยังไม่มีข้อมูล 40 50 20 65 10 45 30 null null null null null null null null
การค้นหาข้อมูลในไบนารีเสิร์ชทรี (BST Search) • การค้นหาโหนดที่มีค่าต่าสุด (Find the Smallest Node) • 1. โหนดที่มีค่าต่าสุดคือ 10อยู่ในตำแหน่งโหนดใบด้านซ้ายของทรี • 2. การค้นหาโหนดที่เก็บค่าต่าสุดในทรี ด้วยการเดินตามบรานซ์ทางซ้ายมือไปจนกระทั่งถึงโหนดใบ • 3. ก็จะค้นพบโหนดที่มีค่าต่ำสุดในไบนารีเสิร์ชทรี
การค้นหาข้อมูลในไบนารีเสิร์ชทรี (BST Search) • การค้นหาโหนดที่มีค่าสูงสุด (Find the Largest Node) • 1. การค้นหาจะเริ่มต้นจากรูทโหนด และเดินตามไปยังบรานช์ฝั่งขวา • 2. จนกระทั่งพบโหนดที่มีค่าสูงสุด ก็คือ 65
การดำเนินงานในไบนารีเสิร์ชทรี (BST Operation) การแทรกโหนด (Insertion) • การแทรกโหนดใน BST จะดำเนินการแทรกที่ตำแหน่งโหนดใบ หรือโหนดที่คล้ายใบ • กระทำการแทรกที่โหนดใบในตำแหน่งที่ยังคงไว้ซึ่งคุณสมบัติของ BST 40 50 20 10 65 30 45
การดำเนินงานในไบนารีเสิร์ชทรี (BST Operation) • เพิ่ม โหนด25 40 40 50 50 20 20 10 10 65 65 30 30 45 45 25
การดาเนินงานในไบนารีเสิร์ชทรี (BST Operation) • เพิ่ม โหนด40 40 40 50 50 20 20 10 10 65 65 30 30 45 45 25 40
การดำเนินงานในไบนารีเสิร์ชทรี (BST Operation) การลบโหนด(Delete) • การลบโหนดออกจากไบนารีเสิร์ชทรี มีความเป็นไปได้ 4 ประการ • 1. กรณีโหนดที่ต้องการลบไม่มีลูก ให้ดาเนินการลบได้ทันที • 2. กรณีโหนดที่ต้องการลบมีเฉพาะซับทรีด้านขวา ให้ทำการลบโหนดดังกล่าวทิ้ง และดึงซับทรีด้านขวาขึ้นมาแทน
การดำเนินงานในไบนารีเสิร์ชทรี (BST Operation) การลบโหนด(Delete) • 3. กรณีโหนดที่ต้องการลบมีเฉพาะซับทรีด้านซ้าย ให้ทาการลบโหนดดังกล่าวทิ้ง และดึงซับทรีด้านซ้ายขึ้นมาแทน • 4. กรณีโหนดที่ต้องการลบมีสองโหนดซับทรี (ทั้งด้านซ้ายและขวา) มี 2 แนวทาง • ให้ดำเนินการหาโหนดที่มีค่ามากที่สุดในซับทรีด้านซ้ายของโหนดที่ต้องการลบ และเคลื่อนย้ายมาแทนที่ตาแหน่งโหนดที่ถูกลบ • ให้ดำเนินการหาโหนดที่มีค่าน้อยที่สุดในซับทรีด้านขวาของโหนดที่ต้องการลบ และเคลื่อนย้ายมาแทนที่ตาแหน่งที่โหนดถูกลบ
การดาเนินงานในไบนารีเสิร์ชทรี (BST Operation) • ลบ โหนด50 40 40 Node to be delete 50 20 50 20 10 65 30 10 45 65 30 45 48 25 40 48 25 40 Find delete node Find largest node
การดาเนินงานในไบนารีเสิร์ชทรี (BST Operation) • ลบ โหนด50 Move Largest Node here 40 40 Node to be delete 48 20 50 20 10 65 30 10 45 65 30 45 48 25 40 48 25 40 Move Largest Node Largest Node On left subtree