Expression Tree

Download Report

Transcript Expression Tree

Expression Tree
Binary Tree Search
Expression Tree
เอ็กซ์ เพรสชันทรี คือ อะไร
เอ็กซเพรสชั
นทรี เป็ นการ
์
ประยุกตการใช
้งานจากไบนารีทรี
์
มีหลักการทางานเหมือนไบนารีทรี
แตเอ็
นทรีจะใช้เก็บ
่ กซเพรสชั
์
นิพจนทางคณิ
ตศาสตร ์
์
โดยเอ็กซเพรสชั
นทรีมข
ี อมู
้ ล
์
ดวยกั
น 2 ชนิด คือ
้
Expression Tree
ข้ อมูลใน เอ็กซ์ เพรสชันทรี
รูจั
้ กขอมู
้ ลทัง้ 2 ชนิด
โอเปอรแรนด
์
์ คือ ตัวถูก
ดาเนินการ(ตัวแปรหรือคาคงที
)
่
เช่น A B C D หรือ 1 3 5 7
โอเปอรเรเตอร
่ งหมายการ
์
์ คือ เครือ
คานวณตางๆ
เช่น
่
เช่น + - * /
Expression Tree
คุณลักษณ์ ของ เอ็กซ์ เพรสชันทรี
1 โอเปอรแรนด
์
์ จะถูกเก็บไว้ที่
โหนดใบ
2 โอเปอรเรเตอร
ู
้ ร่ ท
์
์ จะถูกเก็บไวที
โหนด หรือโหนดอืน
่ ทีไ่ มใช
่ ้
โหนดใบ
3 ซับทรี จะมีรูทโหนดเป็ นตัว
โอเปอรเรเตอร
์
์
Expression Tree
คุณลักษณ์ ของ เอ็กซ์ เพรสชันทรี
โอเปอรแรนด
้ ่
์
์ จะถูกเก็บไวที
โหนดใบ
+
*
A
D
+
B
C
โอ
เปอร ์
แรนด ์
Expression Tree
คุณลักษณ์ ของ เอ็กซ์ เพรสชันทรี
โอเปอรเรเตอร
้ ่
์
์ จะถูกเก็บไวที
รูทโหนด หรือ โหนดอืน
่ ทีไ่ มใช
่ +้
โหนดใบ
โอ
เปอรเร
์
เตอร ์
*
A
D
+
B
C
Expression Tree
คุณลักษณ์ ของ เอ็กซ์ เพรสชันทรี
ซับทรี จะมีรท
ู โหนดเป็ นตัว
โอเปอรเรเตอร
+์
์
จะมี
ร
ู
ท
*
D
โหนดเป็ น
เครื่ องหมาย
+
A
B
C
Expression Tree
การท่ องไปใน เอ็กซ์ เพรสชันทรี
จะใช้วิธเี ดียวกันกับการทอง
่
ในไบนารีทรี
แตจะเรี
ยกตางกั
น
่
่
1. ในเอ็กซเพรสชั
นทรี Prefix ในไบนารีทรี
์
เรียก Preorder
= NLR
2. ในเอ็กซเพรสชั
นทรี Infix ในไบนารีทรี
์
เรียก Inorder
= LNR
3. ในเอ็กซเพรสชั
นทรี Postfix ในไบนารีทรี เรียก
์
Postorder = LRN
Expression Tree
การท่องเอ็กซ์เพรสชันทรี แบบ Prefix
Prefix = NLR
+*
A
+
+BCD
*
A
D
+
B
C
Expression Tree
การท่องเอ็กซ์เพรสชันทรี แบบ Postfix
Postfix = LRN
A B C+
*
D
+
+
*
A
D
+
B
C
Expression Tree
การท่องเอ็กซ์เพรสชันทรี แบบ Infix
Infix = LNR
+
( ( A * (B+C)) + D)
*
A
D
+
B
C
แบบทดสอบ Expression
Tree
+
-
/
D
*
A
B
C
E
การประยุกต์ ใช้ งาน Binary Tree
ต้ นไม้ ของนิพจน์ ทางคณิตศาสตร์ (Expression Tree)
• เราสามารถแทนนิพจน์ทางคณิตศาสตร์ ด้วยโครงสร้ างข้ อมูลแบบต้ นไม้
ได้ เช่นแทน ((A*B) + C) + ((D + (E / F)) - G)
13
ต้ นไม้ ของนิพจน์ ทางคณิตศาสตร์ (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
Inorder Traversal (Left, Node, Right)
 ให้ Infix Expression ((A*B)+C)+((D+(E/F))-G)
Postorder Traversal (Left, Right, Node)
 ให้ Postfix Expression AB*C+DEF/+G-+
Preorder Traversal (Node, Left, Right)
 ให้ Prefix Expression ++*ABC-+D/EFG
การคานวณหาค่ าของ Expression Tree
Infix Expression
Postfix Expression
Prefix Expression
(A + (B/C)) + ((D*E)+((F-G)*H))
ABC/+DE*FG–H*++
++A/BC+*DE*-FGH
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ตาแหน่ง
Input a b + c d e + * *
ab+cde+**
• Input 2 ตัวแรกเป็ น
Operand จึงสร้ างต้ นไม้ ขนาด
1 โหนดแล้ ว push พอยน์ เตอร์ 1
อันลงบนสแตก
ab+cde+**

อ่าน + เข้ามา จึง pop พอยน์เตอร์
ออกมาจากสแตก สร้างต้นไม้ใหม่
Push พอยน์เตอร์ที่ช้ ีไปยังต้นไม้ที่
สร้างขึ้นมาใหม่ลงไปบนสแตก
ab+cde+**

อ่าน c, d, e เข้ามา สร้างต้นไม้
ขนาด 1 โหนด สาหรับอักษรแต่ละตัว
แล้ว Push พอยน์เตอร์ที่ช้ ีไปยัง
ต้นไม้ แต่ละอันนี้ลงบนสแตก
ab+cde+**

อ่าน + เข้ามา จึง pop พอยน์เตอร์
ออกมาจากสแตก สร้างต้นไม้ใหม่
Push พอยน์เตอร์ที่ช้ ีไปยังต้นไม้ที่
สร้างขึ้นมาใหม่ลงไปบนสแตก
ab+cde+**

อ่าน * เข้ามา จึงทาการ Pop พอยน์
เตอร์ออกมาจากสแตก แล้วสร้าง
ต้นไม้ใหม่โดยมี * ที่อ่านเข้ามาเป็น
Root
ab+cde+**

อ่าน * เข้ามา ทาการ Pop
พอยน์เตอร์ออกมาจากสแตก แล้ว
สร้างต้นไม้ใหม่โดยมี * ที่อ่านเข้า
มาเป็น Root
+ C D E +
AB
* *
A
B
C D E +
+
* *
A
+
B
C D E + * *
+
A
C
B
D
E
+* *
+
A
C
B
D
+
E
* *
+
A B
C
*
+
D E
*
+*
*
A B C
+
D
E
แบบฝึ กหัด
• 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
40
null
Binary search tree
• ส่ วนโหนดถัดมา คือ 20 เมื่อเปรียบเทียบค่ าข้ อมูลกับ
Root node แล้ วมีค่าน้ อยกว่ า 40 ก็จะทาการ
แทรกลงมาทางด้ านซ้ ายของโหนด 40
40
40
20
null
20
null
null
Binary search tree
• โหนดต่ อไป คือ 10 เปรียบเทียบ แล้ วมีค่าน้ อยกว่ า 40 จึงต้ อง
นาไปเปรียบเทียบกับโหนดถัดไปทางด้ านซ้ ายในที่นี ้ คือ 20 และ
10 นีม้ ีค่าน้ อยกว่ า 20 ดังนัน้ จึงทาการแทรกลงทางด้ านซ้ ายของ
โหนด 20
40
40
20
10
20
null
10
null
null
null
Binary search tree
• โหนดต่อไป คือ 50 เปรี ยบเทียบ แล้ วมีค่ามากกว่า 40 จึงทาการแทรกลง
ทางด้ านขวาของ Tree 40 เนื่องจากทางด้ านขวาของ 40 ยังไม่มีข้อมูล
40
40
20
10
50
null
20
10
null
null null
50
null
Binary search tree
40
50
20
• ถัดไปคือ 65 เปรี ยบเทียบแล้ วมีค่า มากกว่า 40 จึงต้ องนาไป
เปรี ยบเทียบกับ โหนดถัดไปทางด้ านขวาในที่นี ้ คือ 50 และ 65 นี ้ทีค่า
มากกว่า 50 ฉะนันจึ
้ งทาการแทรกลงทางด้ านขวาของ Tree 50
เนื่องจากทางด้ านขวาของ 50 ยังไม่มีข้อมูล
40
65
10
20
null
10
null
null null
50
null
65
null
Binary search tree
40
50
20
• ถัดไปคือ 45 เปรี ยบเทียบ แล้ วมีค่ามากกว่า 40 จึงต้ องนาไป
เปรี ยบเทียบกับโหนดถัดไปทางด้ านขวาในที่นี ้ คือ 50 และ 45 นี ้มีค่า
น้ อยกว่า 50 ฉะนันจึ
้ งทาการแทรกลงทางด้ านซ้ ายของ Tree 50
เนื่องจากทางด้ านซ้ ายของ 50 ยังไม่มีข้อมูล
40
10
45
65
20
null
10
50
null
65
null
null
null
45
null
null
Binary search tree
40
50
20
• ท้ ายสุดคือ 30 เปรี ยบเทียบแล้ วมีค่าน้ อยกว่า 40 จึงต้ องนาไป
เปรี ยบเทียบกับโหนดถัดไป ทางด้ านซ้ ายในที่นี ้คือ 20 และ 30 นี ้มีค่า
มากกว่า 20 ฉะนัน้ จึงทาการแทรกลงทางด้ านขวาของ Tree 20
เนื่องจากทางด้ านขวาของ 20 ยังไม่มีข้อมูล
40
10
45
65
50
20
30
null
10
null
null
null
65
null
30
45
null
null
null
การค้ นหาข้ อมูลในไบนารีเสิ ร์ชทรี
(BST Search)
• การค้ นหาโหนดที่มีค่าต่ าสุด (Find the
Smallest Node)
• 1. โหนดที่มีค่าต่ าสุดคือ 10 อยู่ในตาแหน่ งโหนด
ใบด้ านซ้ ายของทรี
• 2. การค้ นหาโหนดที่เก็บค่ าต่ าสุดในทรี ด้ วยการ
เดินตามบรานซ์ ทางซ้ ายมือไปจนกระทั่งถึงโหนด
ใบ
• 3. ก็จะค้ นพบโหนดที่มีค่าต่าสุดในไบนารีเสิร์ชทรี
การค้ นหาข้ อมูลในไบนารีเสิ ร์ชทรี
(BST Search)
• การค้ นหาโหนดที่มีค่าสูงสุด (Find the
Largest Node)
• 1. การค้ นหาจะเริ่มต้ นจากรูทโหนด และเดิน
ตามไปยังบรานช์ ฝ่ ั งขวา
• 2. จนกระทั่งพบโหนดที่มีค่าสูงสุด ก็คือ 65
40
50
20
10
การดาเนินงานในไบนารีเสิ ร์ชทรี
(BST Operation) การแทรกโหนด
(Insertion)
30
45
• การแทรกโหนดใน BST จะดาเนินการแทรกที่
65 ตาแหน่ งโหนดใบ หรื อโหนดที่คล้ ายใบ
• กระทาการแทรกที่โหนดใบในตาแหน่ งที่ยังคงไว้
ซึ่งคุณสมบัตขิ อง BST
การดาเนินงานในไบนารีเสิ ร์ชทรี
(BST Operation)
• เพิ่ม โหนด 25
40
50
20
10
40
30
45
50
20
65
10
30
25
45
65
การดาเนินงานในไบนารีเสิ ร์ชทรี
(BST Operation)
• เพิ่ม โหนด 40
40
50
20
10
40
30
45
50
20
65
10
30
25
45
40
65
การดาเนินงานในไบนารีเสิ ร์ชทรี
(BST Operation) การลบโหนด (Delete)
• การลบโหนดออกจากไบนารีเสิร์ชทรี มีความเป็ นไปได้
4 ประการ
• 1. กรณีโหนดที่ต้องการลบไม่ มีลูก ให้ ดาเนินการลบได้
ทันที
• 2. กรณีโหนดที่ต้องการลบมีเฉพาะซับทรีด้านขวา ให้ ทา
การลบโหนดดังกล่ าวทิง้ และดึงซับทรีด้านขวาขึน้ มา
แทน
การดาเนินงานในไบนารีเสิ ร์ชทรี
(BST Operation) การลบโหนด (Delete)
• 3. กรณีโหนดที่ต้องการลบมีเฉพาะซับทรีด้านซ้ าย ให้ ทาการ
ลบโหนดดังกล่ าวทิง้ และดึงซับทรีด้านซ้ ายขึน้ มาแทน
• 4. กรณีโหนดที่ต้องการลบมีสองโหนดซับทรี (ทัง้ ด้ านซ้ าย
และขวา) มี 2 แนวทาง
– ให้ ดาเนินการหาโหนดที่มีค่ามากที่สุดในซับทรี ด้านซ้ ายของ
โหนดที่ต้องการลบ และเคลื่อนย้ ายมาแทนที่ตาแหน่ งโหนดที่ถูก
ลบ
– ให้ ดาเนินการหาโหนดที่มีค่าน้ อยที่สุดในซับทรี ด้านขวาของ
โหนดที่ต้องการลบ และเคลื่อนย้ ายมาแทนที่ตาแหน่ งที่โหนดถูก
ลบ
การดาเนินงานในไบนารีเสิ ร์ชทรี
(BST Operation)
• ลบ โหนด 50
30
25
45
40
50
20
50
20
10
40
Node to be
delete
40
65
48
10
30
25
45
40
65
48
Find delete node
Find largest node
การดาเนินงานในไบนารีเสิ ร์ชทรี
(BST Operation)
• ลบ โหนด 50
30
25
45
40
48
20
50
20
10
40
Node to be
delete
40
65
48
Largest Node
On left subtree
Move Largest
Node here
10
30
25
45
40
65
48
Move Largest
Node
การดาเนินงานในไบนารีเสิ ร์ชทรี
(BST Operation)
• ลบ โหนด 50
40
48
20
10
30
25
45
40
Delete complete
65
การดาเนินงานในไบนารีเสิ ร์ชทรี
(BST Operation)
• ลบ โหนด 45
40
40
50
20
10
30
25
Node to be
delete
45
46
30
25
48
40
49
Find delete node
50
20
10
65
Node to be
delete
65
45
48
40
46
49
Find smallest node
การดาเนินงานในไบนารีเสิ ร์ชทรี
(BST Operation)
• ลบ โหนด 45
40
40
50
20
10
30
25
Node to be
delete
45
46
30
25
48
40
49
Smallest node on right subtree
50
20
10
65
Move smallest
Node here
65
45
48
40
46
49
move smallest node
การดาเนินงานในไบนารีเสิ ร์ชทรี
(BST Operation)
• ลบ โหนด 45
40
50
20
10
30
25
Delete complete
46
40
65
48
49
แบบฝึ กหัด
• 1. จงแสดงภาพแต่ ละขัน้ ตอนของการสร้ าง
Binary Search Tree จากข้ อมูลต่ อไปนี ้
•
5 8 2 3 9 1 7 10 6
แบบฝึ กหัด
60
70
30
10
5
20
80
65
75
85
• 2. จากรูปไบนารีทรีเสิร์ชที่กาหนดให้ ต่อไปนี ้ จง
วาดรูปแสดงการดาเนินการกับไบนารีทรี เสิร์ชตาม
ลาดับต่ อไปนี ้
แบบฝึ กหัด
•
•
•
•
2.1 ป้อน 15
2.2 ป้อน 95
2.3 ลบ 30
2.4 ลบ 85