โครงสร้างข้อมูลและอลั กอริธึม
โครงสร้างข้อมูลทรีและไบนารีทรี
(Tree and Binary Tree)
1
Terminology A
BC
ต้นไม้ (Tree) ประกอบดว้ ย
1. Node Node A, B, C
ใชเ้ กบ็ ขอ้ มูล Branch AB, AC
2. Branch
ใชเ้ ช่ือม Node เขา้ ดว้ ยกนั 2
Degree หมายถึง จานวน Branch ท่ีสมั พนั ธ์กบั Node
แบ่งเป็ น
1. Indegree A
หมายถึง Branch ท่ีเขา้ หา Node C
B
2. Outdegree
หมายถึง Branch OInNuทdot่ีอeddgอeerกgeจAreาeกeมN==ี Do02edgeree เท่ากบั 2
3
Root หมายถึง Node แรกของ Tree
Root
A
BC
4
ดงั น้นั จะพบวา่ ตน้ ไมท้ วั่ ไป Root มี Outdegree = N
Root มี Indegree = 0 อื่นๆ มี Outdegree = N
อ่ืนๆ มี Indegree = 1
Leaf หมายถึง Node ที่มี Outdegree เท่ากบั 0
A
BC
Leaf B, C
6
Internal node
หมายถึง Node ท่ีไม่ใช่ Root และ Leaf
A
BC
DE
Root A
Leaf D, E, C
Internal node B
7
Parent หมายถึง Node ที่มี Outdegree
A
BC
DE
Parent A, B
8
Child หมายถึง Node ท่ีมี Indegree
A
BC
DE
Child B, C, D, E
9
Sibling หมายถึง Node ท่ีมี Parent เดียวกนั
A
BC
DE
Sibling {B, C}, {D, E}
10
Path หมายถึง เสน้ ทางจาก Node หน่ึงไปยงั อีก Node หน่ึง
A
BC
D E
Path จาก A ไป E A -> B -> E
** ทุก Node ใน Tree จะตอ้ งมี Path เดียวเท่าน้นั **
11
Ancestor หมายถึง ทุก Node ในเสน้ ทางจาก Root ไปยงั
Node ท่ีตอ้ งการ A
BC
DE
Ancestor ของ E A, B
12
Descendent หมายถึง ทุก Node ในเสน้ ทางจาก Node
ท่ีกาหนดไปจนถึง Leaf
A
BC
DE
Descendent ของ A B, C, D, E
Descendent ของ B D,E
13
Level หมายถึง ระยะทางจาก Root
A Level 0
BC Level 1
DE Level 2
14
Height หรือ Depth ของ Tree หมายถึง Level สูงสุด
ของ Leaf บวกดว้ ย 1 A Level 0
B C Level 1
D E Level 2
Height = 2 + 1 = 3
15
Parents A,B,F 16
Children B,E,F,C,D,G,H,I
Siblings {B,E,F}, {C,D}, {G,H,I}
Leaves
Internal nodes C,D,E,G,H,I
Ancestor of G B,F
Descendent of A A,F
Height B,E,F,C,D,G,H,I
3
Subtree หมายถึง โครงสร้างที่เชื่อมต่อกนั ภายใต้ Root โดย
Node แรกของ Subtree จะเป็น Root ของ
Subtree น้นั และใชเ้ ป็นชื่อเรียก Subtree
Subtree สามารถแบ่งยอ่ ยเป็น Subtree ไดอ้ ีกจนกวา่ จะ
Empty
17
18
Tree Representation
หมายถึง ลกั ษณะของการนาเสนอโครงสร้างขอ้ มูลทรี ซ่ึงสามารถทาได้ 3
แบบ ดงั น้ี
1. General Tree
การนาเสนอแบบรูปภาพตน้ ไม้
2. Indented List
การนาเสนอโดยใชก้ ารยอ่ หนา้
3. Parenthetical List
การนาเสนอโดยใชเ้ ครื่องหมายวงเลบ็ เหมือนนิพจน์
19
ตวั อยา่ งท่ี 1 Indented List :
General Tree Computer
Case
...
CPU
Controller
ALU
...
ROM
3.5” Disk
... ...
CD-ROM
...
Parenthetical List :
Computer (Case(...)CPU(Controller ALU … ROM)3.5”Disk (... ) … CD/ROM(...))
20
ตวั อยา่ งท่ี 2 Indented List :
A
General Tree
B
Parenthetical List : C
A (B (C D) E F (G H I) ) D
E
F
G
H
I
21
แบบฝึ กหดั 1.1 Root
1.2 Leaves
1. จากตน้ ไมต้ ่อไปน้ี จงหา 1.3 Internal nodes
1.4 Ancestors of H
1.5 Descendents of F
22
2. จากตน้ ไมต้ ่อไปน้ี จงหา 2.1 Indegree of node F
B 2.2 Outdegree of node
2.3 Siblings of H
2.4 Parent of K
2.5 Children of C
23
3. จากตน้ ไมต้ ่อไปน้ี จงหา 3.1 Height of the tree
3.2 Height of node G
3.3 Level of node G
3.4 Level of node A
3.5 Height of node E
24
4. จงแสดง Subtree ต่าง ๆ ของโหนด F ของต้นไม้
ต่อไปนี้
25
5. จงนาเสนอตน้ ไมต้ ่อไปน้ีโดยใชร้ ูปแบบ Indented List
26
6. จงนาเสนอตน้ ไมต้ ่อไปน้ีโดยใชร้ ูปแบบ Parenthetical List
27
7. จงเปลี่ยนรูปแบบการนาเสนอตน้ ไมต้ ่อไปน้ีใหอ้ ยใู่ นรูปแบบตน้ ไม้
ทวั่ ไป
7.1 a ( b ( c d ) e f ( g h ) )
7.2. I(J K (M (H P) N ) L)
28
Binary Tree
หมายถึง ตน้ ไมท้ ี่แต่ละ Node มี
Subtree <= 2
หรือ
Outdegree <= 2
29
ตวั อยา่ ง Binary Tree
30
Empty
หรือ
Null Tree
31
Height of Binary Tree
คาถามท่ี 1
มี Node อยทู่ ้งั หมด 7 Nodes
1.1 จะสร้าง Tree ใหม้ ี Height สูงสุดไดเ้ ท่าไร อยา่ งไร
1.2 จะสร้าง Tree ใหม้ ี Height ต่าสุดไดเ้ ท่าไร อยา่ งไร
Hmax = N
Hmin = log2N + 1
32
คาถามท่ี 2
Tree ท่ีมี Height = 3
2.1 จะมี Node สูงสุดไดเ้ ท่าไร อยา่ งไร
2.2 จะมี Node ต่าสุดไดเ้ ท่าไร อยา่ งไร
Nmax = 2H - 1
Nmin = H
33
Balance
Binary Tree จะ Balance เม่ือทุก ๆ Subtree มี
Balance Factor เท่ากบั 0
Balance Factor = HL - HR
34
B = 1-0 = 1 B = 0-1 = -1
Balance Balance B=0 B=0
B=0 B=0
Balance B = 1-1 = 0 B = 2-1 = 1
B = 0 B = 1-1 = 0 B=0
B=0 B=0
B=0
B = 0-2 = -2 B = 2-0 = 2
B = 1-0 = 1
B = 0-1 = -1 B=0
B=0
35
Complete Binary Tree
Binary Tree ท่ีมี Node เตม็ ทุก Level
Nearly Complete Binary Tree
Binary Tree ท่ีมี Node เตม็ ทุก Level ยกเวน้ Level
สุดทา้ ย และ Node ใน Level สุดทา้ ยอยเู่ รียงกนั ทางซา้ ยมือ
36
ตวั อยา่ ง Complete และ Nearly Complete Binary
Tree
37
การแทนคา่ Binary Tree
การแทนดว้ ยอะเรย์
การแทน Binary Tree ดว้ ยอะเรยจ์ ะอาศยั อะเรยเ์ ดี่ยวเพียงอะเรยเ์ ดียว
และใชด้ รรชนีของอะเรยเ์ ป็นตวั กาหนดหมายเลขประจาโหนด การใหห้ มายเลข
ประจาโหนดจะเริ่มท่ีโหนดรากโดยใหโ้ หนดรากมีหมายเลขเท่ากบั 0 และให้
หมายเลข 1 และ 2 กบั โหนดทางซา้ ยและโหนดทางขวาตามลาดบั จากน้นั กใ็ ห้
หมายเลขในระดบั ถดั ไปดว้ ยวธิ ีการเช่นเดิม ตน้ ไมท้ ่ีใหห้ มายเลขประจาจะมี
ลกั ษณะดงั รูป จะสงั เกตไดว้ า่ การใหห้ มายเลขจะทาเสมือนวา่ ตน้ ไมน้ ้นั เป็น
Complet Binary Tree โหนดท่ีขาดหายไปจึงยงั คงตอ้ งให้
หมายเลขกากบั ไวด้ ว้ ย
39
การแทน Array
a
bc
d ef g
h ij
0123456789
abcdefghij
40
การแทนดว้ ย Array
a
bc
de
fg
A,b,c,2x,d,e,4x,f,g
0 1 2 3 4 5 6 7 8 9 10 11 12
abc de fg
41
การแทนดว้ ย Array j
h
i
kl
m
0123456789
hijkl m
42
การแทนดว้ ย Array
ตน้ ไมม้ ีความลึกเท่ากบั 3 จึงมีจานวนโหนดสูงสุดได้ 15 โหนด เม่ือ
มองแบบ Complete Binary Tree อะเรยท๎ ่ีใชแ้ ทนจึง
ตอ้ งกาหนดใหม้ ีขนาด 15 หน่วย ในการคานวณหาตาแหน่งของ
โหนดในอะเรย์ หากให้ n เป็นโหนดแม่ เราสามารถหาตาแหน่งของ
โหนดลูกทางซา้ ย LeftNode(n) และตาแหน่งของ โหนดลูก
ทางขวา RightNode(n) ไดจ้ าก
LeftNode(n) = (2*n)+1
RightNode(n) = (2*(n + 1))
43
การแทนดว้ ย Array
ในทานองกลบั กนั หากให้ s เป็นตาแหน่งของโหนดลูกใดๆ (ไม่วา่
จะทางซา้ ยหรือขวากต็ าม) เราสามารถคานวณหาตาแหน่งของโหนด
แม่ MotherNode(s) ไดจ้ าก
MotherNode(s) = (s-1) div 2
ขนาดของอะเรยท์ ่ีใชจ้ ะข้ึนกบั ความลึกของตน้ ไม้ ยงิ่ ตน้ ไมม้ ีความลึก
มากเท่าใดกย็ ง่ิ ตอ้ งใชอ้ ะเรยข์ นาดใหญ่ข้ึนตามไปดว้ ย การแทนตน้ ไม้
ดว้ ยอะเรยจ์ ะเหมาะสมกบั ตน้ ไมแ้ บบ Complete Binary
Tree มากที่สุด เน่ืองจากจะไม่มีท่ีวา่ งสูญเปล่าในอะเรยเ์ ลย
44
Binary Tree Operation
MakeTree(Item); สร้างตน้ ไมท้ ี่มีแต่ Root Node
LeftNode(Tree, n); สอบถามโหนดดา้ นซา้ ยของโหนด n
RightNode(Tree, n); สอบถามโหนดดา้ นขวาของโหนด n
MotherNode(Tree, n); สอบถามโหนดแม่ของโหนด n
BrotherNode(Tree, n); สอบถามโหนดพนี่ อ้ งของโหนด n
isLeft(Tree, n); ตรวจสอบวา่ เป็นโหนดซา้ ยหรือไม่
isRight(Tree, n); ตรวจสอบวา่ เป็นโหนดซา้ ยหรือไม่
SetLeft(Tree, n, Item); สร้างโหนดใหม่ที่ดา้ นซา้ ยของโหนด n
SetRight(Tree, n, Item); สร้างโหนดใหม่ที่ดา้ นขวาของโหนด
n
45
การแทนดว้ ยลิงคล์ ิสต์
การแทนตน้ ไมแ้ บบทวภิ าคดว้ ยลิงคจ์ ะอาศยั พอยเตอร์เป็นตวั เช่ือมโยง
ระหวา่ งโหนดแม่และโหนดลูก โครงสร้างของโหนดจะประกอบดว้ ย
ส่วนที่เกบ็ ข่าวสาร พอยเตอร์ช้ีโหนดลูกทางซา้ ย และพอยเตอร์ช้ี
โหนดลูกทางขวา โครงสร้างของโหนดจะประกอบดว้ ยส่วนต่างๆ 3
ส่วนคือ
Item สาหรับเกบ็ ขา่ วสาร
Left เป็นพอยเตอร์ช้ีโหนดลูกทางซา้ ย
Right เป็นพอยเตอร์ช้ีโหนดลูกทางขวา
46
การแทนดว้ ยลิงคล์ ิสต์
โครงสร้างของโหนดสามารถนิยามไดด้ งั น้ี
typedef struct Node { char Info;
struct node *Left;
struct node *Right;
} TYPE_NODE;
typedef struct Node *TYPE_NODEPTR;
Left Info Right
47
การแทนดว้ ยลิงคล์ ิสต์
‘A’
‘B’ ‘C’
‘D’ ‘E’ ‘F’ ‘G’
48
ภาพแสดงการประยุกต์ Linked-List เป็ น B-Tree
Linked-List Data Data Data
Linked-List กบั B-Tree Data
Data Data
49
Binary Tree Traversal
1. Depth-first
Descendent ท้งั หมดของ Child จะตอ้ งถูกประมวลผล
ก่อน Child ถดั ไป
2. Breath-first
ประมวลผลทีละ Level จากบนลงล่าง
50