โครงสร้างข้อมูลแบบต้นไม้ - ผศ.วิวัฒน์ ชินนาทศิริกุล

Download Report

Transcript โครงสร้างข้อมูลแบบต้นไม้ - ผศ.วิวัฒน์ ชินนาทศิริกุล

โครงสร้างข้อมูลแบบต้นไม้
อ.วิวฒ
ั น์ ชินนาทศิริกุล
นิยามของโครงสร้างต้นไม้

โครงสร้างข้อมูลแบบต้นไม้ มีคุณสมบัติดงั นี้
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

Immediate Successor คือโหนดทั้งหลายของต้นไม้ยอ่ ย i ที่มีค่า
ระดับตา่ กว่าโหนด i อยูห่ นึ่ ง เช่น SON ของโหนด H คือโหนด E, I,
และ F
Immediate Predecessor หรือ father ของโหนด i

Immediate Predecessor คือโหนดที่มีค่าระดับสูงกว่าโหนด i
อยูห่ นึ่ ง เช่น FATHER ของโหนด J คือโหนด I,
ของโหนด I คือโหนด H เป็ นต้น
FATHER
ต้นไม้แบบไบนารี (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 - - - - - - รูปการแทนต้นไม้โดยใช้อาร์เรย์
การเดินเข้าไปในโครงสร้างต้นไม้ (TreeTraversal)

การนาต้นไม้ไบนารีมาใช้ประโยชน์น้ัน หมายความว่าต้องมีวิธี เดิน หรือ
traverse เข้าไปในต้นไม้อย่างมีแบบแผน เพื่อไป เยี่ ยม โหนดต่าง ๆ
โหนดละ 1 ครั้ง คาว่า เยี่ ยม หมายถึงว่าเราจะไปยังโหนดเพื่อประมวลผล
บางอย่างที่ตอ้ งการกระทากับโหนดนั้น เช่น หาข่าวสาร ดังนั้นผลลัพธ์
จากการเดินเข้าไปในต้นไม้คือจะได้ข่าวสารที่เก็บ (หรือชี้ ) โดยโหนด
เหล่านั้นออกมาในรูปเชิงเส้น ซึ่งนาไปใช้ประโยชน์ได้

ความคิดเริ่มต้นของการเดินก็คือ เราต้องเยีย่ มแต่ละโหนดพร้อมทั้งต้นไม้
ย่อยทางซ้าย และทางขวาของโหนดนั้น ตามแนวคิดนี้ เราจะแยกต้นไม้ไบ
นารีออกเป็ น 3 ส่วนคือ R, TL และTR โดยที่ R จะแทนรูตโหนด TL จะ
แทนต้นไม้ยอ่ ยทางซ้าย และ TR จะแทนต้นไม้ยอ่ ยทางขวา จะเห็นได้วา่ จะ
มีวธิ ีเดินอยู่ 6 ทางคือ RTL TR, TL RTR, TL TRR, TRTL R, TRRTL และ
RTRTL

มีวธิ ีเดิน 6 วิธี จะกล่าวเพียง 3 วิธีแรกเท่านั้น ซึ่ง 3 วิธีแรก มีชื่อเรียก
พิเศษและลักษณะรายละเอียดการเดินดังนี้
(1) เดินแบบพรีออร์เดอร์ (pre-order traversal) - RTLTR
- เยีย่ ม R
- เดินเข้าไปใน TL (ของ R) อย่างพรีออร์เดอร์
- เดินเข้าไปใน TR (ของ R) อย่างพรีออร์เดอร์
(2) เดินแบบอินออร์เดอร์ (in-order traversal) - TLRTR
- เดินเข้าไปใน TL (ของ R) อย่างอินออร์เดอร์
- เยีย่ ม R
- เดินเข้าไปใน TR (ของ R) อย่างอินออร์เดอร์
(3) เดินแบบโพสต์ออร์เดอร์ (post-order traversal) - TLTRR
- เดินเข้าไปใน TL (ของ R) อย่างโพสต์ออร์เดอร์
- เดินเข้าไปใน TR (ของ R) อย่างโพสต์ออร์เดอร์
- เยีย่ ม R
A
B
C
D
E
G
H
F
I
พรีออร์เดอร์
: ABDGCEHIF (RTLTR)
อินออร์เดอร์
: DGBAHEICF (TL RTR)
โพสต์ออร์เดอร์ : GDBHIEFCA (TLTR R)
Jim
Ron
Dot
Amy
Guy
Ann
Eva
Jan
Kay
Jon
Tim
Kim
Roy
จงท่องเข้าไปในต้นไม้ แบบ
1.พรีออร์เดอร์
2.อินออร์เดอร์ 3.โพสต์ออร์เดอร์
Tom
+
-
A
*
B
D
C
จงท่องเข้าไปในต้นไม้ แบบ
1.พรีออร์เดอร์
2.อินออร์เดอร์ 3.โพสต์ออร์เดอร์
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

ถ้าอินพุต คือ a b + c d e + * *
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
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 โหนด
แบบฝึ กหัด
1. จากต้นไม้ไบนารีที่กาหนด ให้เขียนผลลัพธ์จากการท่องเข้าไปในต้นไม้ แบบ
Preorder ,Inorder , Postorder
A
B
D
C
G
E
H
F
I
J
K
L
แบบฝึ กหัด (ต่อ)
2. จงสร้าง Binary Search Tree จากข้อมูลดังนี้
10, 8, 2, 4, 3, 15, 26, 30 ,17, 6
3. จงสร้าง Expression Tree จากนิ พจน์ต่อไปนี้
3.1 (A - 2 * (B + C) – D * E) * F
3.2 A + (B – C) * D ^ ( E * F )