โครงสร้างต้นไม้ (Tree Structure)

Download Report

Transcript โครงสร้างต้นไม้ (Tree Structure)

โครงสร้ างข้ อมูลแบบต้ นไม้
(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)
Root Nodes
R
Nodes X เป็ น Immediate Predecessor
ของ Y หรือ X เป็ น Father (Parent) ของ Y
C
Leaf Nodes
A
B
D
H
E
I
X
Y
G
Nodes Y เป็ น Immediate Successor
ของ X หรือ Y เป็ น son (Child) ของ X
โครงสร้างต้นไม้ (Tree Structure)
Root Nodes
R
A
B
D
H
C
Leaf Nodes
E
I
Level 0
X
Level 1
Y
Level 2
G
Level 3
Level แสดงถึงหน่ วยระยะทางตามแนวดิง่ ของโหนดว่าอยูห
่ า่ งจาก
Root Node เป็ นระยะเท่าไรและทุกกิง่ มีความยาวเท่ากันคือ 1 หน่ วย
โครงสร้างต้นไม้ (Tree Structure)
Root Nodes
R
A
B
D
H
C
Leaf Nodes
E
I
Level 0
X
Level 1
Y
Level 2
G
Level 3
Degree แสดงถึงจานวนของ Subtree ของโหนดนัน
้ เช่น A มี Degree
2, X มี Degree 1
โครงสร้างต้นไม้ (Tree Structure)
Root Nodes
R
A
B
D
H
C
Leaf Nodes
E
I
Level 0
X
Level 1
Y
Level 2
G
Level 3
Leaf Node แสดงถึงโหนดทีม
่ ี Degree = 0 เช่น C, D, E, I ,G ส่วนโหนด
ทีม
่ ี Degree <> 0 เรียกว่า Branch Node หรือ Interior Node
โครงสร้างต้นไม้ (Tree Structure)
R
C
A
B
D
H
E
I
X
Nodes X เป็ น Immediate Predecessor
ของ Y หรือ X เป็ น Father (Parent) ของ Y
Y
Nodes Y เป็ น Immediate Successor
ของ X หรือ Y เป็ น son (Child) ของ X
G
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
LLINK RLINK
หรือ
DATA
LSON RSON
โครงสร้างโหนดสาหรับต้นไม้ไบนารี
LLINK
หรือ LSON เป็ นพอยน์เตอร์ชี้ไปยังต้นไม้ยอ่ ยทางซ้าย
ส่วน RLINK หรือ RSON เป็ นพอยน์เตอร์ชี้ไปยังต้นไม้ยอ่ ยทางขวา
การแทนโดยอาศัยแอดเดรสของโหนด หรือการแทน
แบบซีเควนเชียล
เป็ นการแทนต้นไม้ไบนารีดว้ ยอาร์เรย์ 1 มิติอาร์เรย์เดียว การ
แทนแบบนี้ เหมาะกับโครงสร้างต้นไม้ไบนารีแบบ complete
binary tree ที่สุด การแทนจะเริ่มต้นด้วยการให้หมายเลขแก่แต่
ละโหนด ตั้งแต่ระดับ 1 ระดับ 2 ...ไปเรื่อยๆ จนถึงระดับ k
การให้ตวั เลขในแต่ละระดับจะให้จากซ้ายไปขวา โดยให้รตู
โหนดมีหมายเลข 1 เสมอ การให้ตวั เลขจะต้องถือว่าต้นไม้ไบ
นารีเป็ นต้นไม้ไบนารีแบบสมบูรณ์ จึงจะให้ตวั เลขที่อยูแ่ ก่โหนด
ได้
1
A
2
4
8
E
3
B
C
X
D
9
10
6
5
11 12
7
13
14
15
การให้แอดเดรสแก่ตน้ ไม้ไบนารีที่ถกู ต่อเติมให้สมบูรณ์
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
A B X C D - - E - - - - - - รูปการแทนต้นไม้โดยใช้อาร์เรย์ ถ้าพิจาณาโหนดใดๆ เป็ นตาแหน่ ง x โหนดลูก
ทางซ้ายจะมีดชั นี 2x ส่วนโหนดลูกทางขวาจะมีดชั นี 2x+1
การเปลี่ยน Tree ให้ เป็ น Binary Tree
ต้ นไม้ แบบออดินารี(ordinary) คือต้นไม้ที่มีดีกรี สูงสุ ดของแต่ละโหนดเป็ นเท่าไรก็
ได้ ซึ่ งการเปลีย่ นให้ เป็ น binary tree เป็ นการจัดให้แต่ละโหนดมีดีกรี สูงสุ ดเท่ากับ
สอง มีข้ นั ตอนดังนี้
1. พิจารณาที่กิ่งทางซ้ายสุ ดที่อยูใ่ ต้พอ่ เดียวกัน
2. ต่อกิ่งของโหนดทางซ้ายสุ ดในขั้นที่ 1 ไปทางขวาตามลาดับอาวุโสกับพี่นอ้ งที่
เกิดจากพ่อเดียวกัน
3. ทาขั้นที่ 1 และ 2 จนครบทุกโหนด
4. ปรับมุมของแต่ละกิ่ง ประมาณ 45 องศา
Data07 Tree(18)
การเปลี่ยน Tree ให้ เป็ น Binary Tree
ขันที
้ ่1
ขันที
้ ่4
ขันที
้ ่2
ขันที
้ ่3
Data07 Tree(19)
การเปลี่ยน Tree ให้ เป็ น Binary Tree
A
ตัวอย่ าง แสดงการเปลี่ยนต้นไม้ให้เป็ นแบบทวิภาค
โจทย์
A
B
B
C
F
D
E
G
H
C
K
J
L
F
D
E
G
K
J
H
L
I
A
I
B
F
ขั้นที่ 1-3
C
G
D
ผลลัพธ์
J
K
E
H
Data07 Tree(20)
L
I
การเปลี่ยน Forest ให้ เป็ น Binary Tree
โจทย์
A
S
B
D
C
E
F
T
G
V
U
W
X
Y
Z
A
ผลลัพธ์
S
B
T
C
U
D
G
E
F
V
X
W
Y
Z
Data07 Tree(21)
การท่องต้นไม้ (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)
การท่องต้นไม้ไบนารี (Binary Tree
Traversal) start
stop
R
A
C
แบบ Pre-Order Traversal
X
D
Y
G
Result
R
A
C
D
X
Y
G
การท่องต้นไม้ไบนารี (Binary Tree
Traversal)start
stop
R
แบบ In-Order Traversal
A
C
X
D
Y
G
Result
C
A
D
R
G
Y
X
การท่องต้นไม้ไบนารี (Binary Tree
Traversal)start
stop
R
แบบ Post-Order Traversal
A
C
X
D
Y
G
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) ทาง
คณิ ตศาสตร์ของนิพจน์ โดยการวางตัวกระทาที่โหนดใบ(leave node) และวางเครื่ องหมายไว้ที่
โหนดภายใน
สาหรับเครื่ องหมายที่เป็ นเครื่ องหมายเดี่ยว(unary operator) จะมีกิ่งต้นไม้ยอ่ ยเพียงข้าง
เดียว เรามักจะวาง เครื่ องหมายเดี่ยวไว้ทางซ้ายของตัวกระทา ซึ่งเครื่ องหมายที่จดั เป็ นเครื่ องหมายเดี่ยว
ได้แก่ - log() cos()
และมีเครื่ องหมายเดี่ยว ที่ถูกจัดวางไว้ทางขวาของตัวกระทา ได้แก่ แฟกทอเรี ยลฟั งก์ชนั เลขยก
กาลังต่างๆ
ตัวอย่ าง แสดงการสร้าง เอ็กเพรสชันทรี แบบทวิภาค จากนิพจน์ X * Y + Z
+
*
X
Z
Y
Data07 Tree(28)
Expression Tree
ตัวอย่าง แสดงการสร้างเอ็กเพรสชันทรี จากนิพจน์ (X – ((Y / R) * D))
*
X
/
Y
D
R
จะได้วา่
• การเยีย่ มโหนด แบบอินออเดอร์ จะได้ X-Y/R*D
ซึ่ งอยูใ่ นรู ปอินฟิ กฟอร์ ม
• การเยีย่ มโหนด แบบพรีออเดอร์ จะได้ -X*/YRD
ซึ่ งอยูใ่ นรู ปพรีฟิกฟอร์ ม
• การเยีย่ มโหนด แบบโพสออเดอร์ จะได้ XYR/D*- ซึ่ งอยูใ่ นรู ปโพสฟิ กฟอร์ ม
Data07 Tree(29)
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
3
19
45
การลบโหนดออกจาก Binary Search Tree
เมื่อพบโหนดที่ตอ้ งการลบออกแล้ว มีประเด็นที่ตอ้ งพิจารณา ดังนี้
1. ถ้าโหนดนั้นเป็ น leaf ก็ลบออกได้ทนั ที
2. ถ้ามีลกู 1 โหนด, ก็ทาการปรับ pointer ของมันให้ขา้ มโหนดที่จะลบ
นั้นแล้วจึงทาการลบ
3. ถ้าโหนดนั้นมีลกู 2 โหนด ก็ให้แทนที่ค่าของโหนดด้วยค่าที่น้อยที่สุด
ของ right subtree (หาพบได้ง่าย) และให้ทาการ delete โหนดนั้นใน
แบบ recursive เนื่ องจากโหนดที่มีค่าน้อยที่สุดใน right subtree
ย่อมไม่มี left child ดังนั้น การ remove ครั้งหลังจึงทาได้ง่าย
ก่อนและหลัง การลบ node (4) ซึ่งมี child 1 โหนด
ก่อนและหลังการลบโหนด (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 โหนด) เท่ านัน้ ที่เป็ นไป
ตามข้ อกาหนดนี ้ เงื่อนไขการสมดุลนีเ้ ข้ มงวดเกินไปจนอาจใช้ ประโยชน์ ได้
ไม่ ดี
36
AVL Trees
A bad binary tree. Requiring balance at the root is not enough.
37
โครงสร้ างข้ อมูลแบบ Tree
ต้นไม้เอวีแอล (AVL Tree)
เป็ นไบนารีเซิรซ์ เทรีแบบต้นไม้ไบนารีสมดุล :
ถ้า T คือต้นไม้ใดๆ และ N คือโหนดใดๆ บนต้นไม้ T แล้ว ความ
แตกต่างระหว่างความสูงของต้นไม้ยอ่ย (Sub Tree) ทีอ่ ยูท่ างขวา
และทางซ้าย ของ N จะถูกเรียกว่า บาลานซ์แฟคเตอร์ (Balance
Factor) และต้นไม้ T จะถูกเรียกว่าต้นไม้สมดุล เมือ่ บาลานซ์แฟค
เตอร์ของ N ใดๆ ต้องมีคา่ ไม่เกิน |1| (ต้องมีคา่ เป็ น -1 หรือ 0 หรือ
1)
ต้นไม้เอวีแอล (AVL Tree)
1
3
2
1
AVL
Non-AVL
นา้ หนักความสู งของ node = ความสู ง
Subtree(ซ้ าย) - ความสู ง
Subtree(ขวา)
ต้นไม้เอวีแอล (AVL Tree)
AVL TREE เมือ่ มี Tree ทีไ่ ม่สมดุลจะเกิดการหมุนเพือ่ ให้สมดุลซึง่ มี
4 วิธี
1. การหมุนซ้าย : โหนดทางขวามากกว่าซ้าย ยกโหนดที่อยูข่ วาขึ้นมา
2. การหมุนขวา : โหนดทางซ้ายมากกว่าขวา ยกโหนดที่อยูซ่ า้ ยขึ้นมา
3. การหมุนขวาไปซ้าย : หมุนขวาก่อน แล้วค่อยหมุนซ้าย
4. การหมุนซ้ายไปขวา : หมุนซ้ายก่อน แล้วค่อยหมุนขวา
ต้นไม้เอวีแอล (AVL Tree) - การหมุนซ้าย
การหมุนซ้ าย
0
7
-2
5
-1
7
0
0
5
8
0
ไม่สมดุล
8
สมดุล
ต้นไม้เอวีแอล (AVL Tree) - การหมุนขวา
การหมุนขวา
ต้นไม้เอวีแอล (AVL Tree) - การหมุนขวาไปซ้าย
หมุนขวาครั้งแรก
หมุนซ้ายครั้งที่ 2
ต้นไม้เอวีแอล (AVL Tree) - การหมุนซ้ายไปขวา
หมุนซ้ายครั้งแรก
หมุนขวาครั้งที่ 2
การลบ node ใน AVL TREE
ถ้าลบโหนดออกไปแล้วเกิดเสียสมดุล ก็ทาให้ตน้ ไม้สมดุล โดยการ
หมุน
เมื่อลบ
node
4
เมื่อลบ
node
2
การลบ node ใน AVL TREE
เมื่อไม่สมดุล ก็หมุนให้สมดุล จะได้เป็ น
แบบฝึ กหัด
1. จากต้นไม้ไบนารีที่กาหนด ให้เขียนผลลัพธ์จากการท่องเข้าไปในต้นไม้ แบบ
Preorder ,Inorder , Postorder
A
B
D
C
G
E
F
I
2. จงสร้าง Expression Tree จากนิ พจน์ต่อไปนี้
2.1 (A - 2 * (B + C) – D * E) * F
2.2 A + (B – C) * D ^ ( E * F )
H
J
K
L
แบบฝึ กหัด (ต่อ)
1. จงสร้าง Binary Search Tree จากข้อมูลดังนี้
10, 8, 2, 4, 3, 15, 26, 30 ,17, 6
2. จงปรับทรี ต่อไปนี้ให้เป็ น AVL Tree หลังจากเพิ่มโหนด 15, 20, 30
0
-2
-1
-1
0