aj.vishnu - Tree02vishnu/datastructure/aj.vishnu - Tree02.pdf · 196 โครงสร างต...

30
ในบทนี้เราจะมาดูโครงสรางตนไม (ตอไปนี้จะเรียกวา tree ดวย) ลักษณะทั่วไปของโครงสรางตนไม ตัว tree นั้นจะมีลักษณะดังรูป 6.1 รูป 6.1 ลักษณะทั่วไปของ tree ซึ่งดูเปนตนไมที่กลับหัว ซึ่งมี โนด และกิ่งตอกันไปเรื่อยๆ โดย โนด หนึ่งๆมีกี่กิ่งก็ได สวนประกอบโดยทั่วไปของ tree จะเปนดังรูป 6.1 คือ ตัว โนด บนสุดจะเรียกวาเปน ราก (root) ของ tree tree สวนยอย (มี โนด 2 เปน root) เรียกไดวาเปน subtree ของ treeใหญ โนด 1 จะเปน บัพแม (parent) ของ โนด 2,5,6 สวน โนด 2 เปน parent ของ โนด 3,4 หรือ เรียกอีกอยางวา โนด 3,4 เปน บัพลูก (child) ของ โนด 2 บททีโครงสรางตนไม 5. 2. 1. 4. 3. 6. 6.

Transcript of aj.vishnu - Tree02vishnu/datastructure/aj.vishnu - Tree02.pdf · 196 โครงสร างต...

Page 1: aj.vishnu - Tree02vishnu/datastructure/aj.vishnu - Tree02.pdf · 196 โครงสร างต นไม วิศวกรรมคอมพ ิวเตอร จุฬาฯ

ในบทนเราจะมาดโครงสรางตนไม (ตอไปนจะเรยกวา tree ดวย)

ลกษณะทวไปของโครงสรางตนไม ตว tree นนจะมลกษณะดงรป 6.1

รป 6.1 ลกษณะทวไปของ tree

ซงดเปนตนไมทกลบหว ซงม โนด และกงตอกนไปเรอยๆ โดย โนด หนงๆมกกงกได สวนประกอบโดยทวไปของ tree จะเปนดงรป 6.1 คอ • ตว โนด บนสดจะเรยกวาเปน ราก (root) ของ tree • tree สวนยอย (ม โนด 2 เปน root) เรยกไดวาเปน subtree ของ treeใหญ • โนด 1 จะเปน บพแม (parent) ของ โนด 2,5,6 สวน โนด 2 เปน parent ของ โนด 3,4 หรอ

เรยกอกอยางวา โนด 3,4 เปน บพลก (child) ของ โนด 2

บทท โครงสรางตนไม

5. 2.

1.

4. 3.

6.

6.

Page 2: aj.vishnu - Tree02vishnu/datastructure/aj.vishnu - Tree02.pdf · 196 โครงสร างต นไม วิศวกรรมคอมพ ิวเตอร จุฬาฯ

196 โครงสรางตนไม วศวกรรมคอมพวเตอร จฬาฯ

• โนด 3 เปนบพพนอง (sibling) กบ โนด 4 • ถามความสมพนธแบบ parent ตงแตหนงทอดขนไป เราเรยกวา บพบน (ancestor) เชน

โนด 1 เปน ancestor ของ โนด 7 • โนด ทไมมกงออกไป เราเรยกวา บพใบ หรอ ใบ (leaf) เชนในรป 6.1 leaf คอ โนด 3, 4, 5

และ 7 • เราจะสงเกตไดวา มแค 1 เสนทาง (path) จาก root ไปยง โนด แตละ โนด เทานน • ความลก (depth) ของ โนด ni คอความยาวของ path จาก root ถง nI ตวอยางเชน depth ของ

โนด เบอร 7 คอ 2 • ความสง (height) ของ โนด ni คอความยาวของ path ทยาวทสดจาก nI ถง leaf ตวอยางเชน

height ของ โนด เบอร 7 คอ 0 และ height ของ โนด เบอร 1 คอ 2 • height ของ tree กคอ height ของ root นนเอง ถา tree มแค root เราให height เปน 0 และถา

tree เปน empty tree เราให height เปน -1 • height ของตนไมใดๆ จะเทากบ height ของ subtree ทสงทสด บวกดวย 1 • ระดบ (level) ของ โนด คอ ลาดบชนของ โนด นน โดย child ของ โนด หนงๆจะมระดบ1

ระดบมากกวา parent ของมน (root ถอวามระดบเปน 0)

แนวคดในการสรางตนไมโดยทวไป โดยทวไป ถาใหแตละ โนด มกกงกได เราไมมทางกาหนดจานวนกงทแนนอนได เพราะไมรวาจะครบหรอเปลา และการเตรยมกงไวลวงหนามากๆกเปนการเปลองหนวยความจาโดยใชเหตวธหนงทอาจแกปญหานไดคอ ใหแตละ โนด เกบขอมลดงรป 6.2

Page 3: aj.vishnu - Tree02vishnu/datastructure/aj.vishnu - Tree02.pdf · 196 โครงสร างต นไม วิศวกรรมคอมพ ิวเตอร จุฬาฯ

Data Structure โครงสรางตนไม 197

รป 6.2 โนด ของตนไมแบบทวไป

ถาใชโครงสรางขอมลแบบในรป 6.2 เราจะสามารถเตมกงใหมเมอไรกได ตวตนไมจากรป 6.1จะกลายเปนดงรป 6.3

รป 6.3 ลกษณะของตนไมจากรป 6.1 ท ทาจากแนวคดในรป 6.2

นกเปนแนวคดในการเขยนโครงสรางตนไมอยางคราวๆ แตวาในหนงสอเลมนเราจะไมสน โครงสรางตนไมแบบน เราจะสนแตโครงสรางตนไมทมไดอยางมากทสด 2 กงเทานน (binary tree)

ขอมล

Link ไปยงลกกงแรก (first child)

Link ไปยง sibling ถดไป

1

2 5

3

6

4 7

Page 4: aj.vishnu - Tree02vishnu/datastructure/aj.vishnu - Tree02.pdf · 196 โครงสร างต นไม วิศวกรรมคอมพ ิวเตอร จุฬาฯ

198 โครงสรางตนไม วศวกรรมคอมพวเตอร จฬาฯ

อนดบสองทด เปน subtree

ซงภายในกจะเรยงดแบบ preorder

อนดบ4 ทด เปน subtree

ซงภายในกจะเรยงดแบบ preorder

ประโยชนของโครงสรางตนไม อยางแรกทเหนชดสดๆกคงจะเปนโครงสราง directory หรอ folder ในระบบปฏบตการของเรานนแหละ ทงวนโดวส ยนกซ การใชโครงสรางตนไมมความงาย และยงทาใหของทอยตาง folder ใชชอเหมอนกนได

รปแบบการเรยงดสมาชกภายในตนไม ยามทเราเขยนโปรแกรมเพอตรวจสอบสมาชกในตนไมจาตองมวธการทแนนอนเพอไมใหม โนดไหนหลดรอดจากการสารวจไป ในปจจบนม 4 วธหลกๆทนยมใชในการเรยงดสมาชกภายในตนไม ดงน

กอนลาดบ (preorder) คอการดของจาก root โนด ทเราเรมพจารณา แลวจงไปดของใน subtree โดยใน subtree กเรมดจาก root โนด เชนเดยวกน ทาอยางนซาไปเรอยๆ รป 6.4 แสดงการเรยงสมาชกในตนไมของรป 6.1 แบบ preorder

รป 6.4 การเรยงดสมาชกของตนไมแบบ preorder

ผลการเรยงสมาชกใน โนด จากรป 6.4 คอ 1,2,3,4,5,6,7

5. 2.

1.

4. 3.

6.

6.

อนดบแรกทด

อนดบ3 ทด

Page 5: aj.vishnu - Tree02vishnu/datastructure/aj.vishnu - Tree02.pdf · 196 โครงสร างต นไม วิศวกรรมคอมพ ิวเตอร จุฬาฯ

Data Structure โครงสรางตนไม 199

หลงลาดบ (postorder) คอการเรยงด subtree ทงหมด แลวจงมาดของใน root ซงภายใน subtree นนกตองมการเรยงดแบบเดยวกน เพราะฉะนนถาเราเรยงสมาชกใน tree ในรป 6.4 แบบ postorder จะไดผลลพธเปน 3,4,2,5,7,6,1

ตามลาดบ (inorder) คอการเรยงสมาชกโดยสมาชกของ subtree ดานซายของ root จะถอวาตองมากอน root สวนสมาชกของ subtree ทอยดานขวาของ root จะถอวามาทหลง root นอกจากนสวนขางในตว subtree กใชวธการเรยงอยางเดยวกน ดงนนถาดจากรป 6.4 (ไมนบ subtree ทม 5 เพราะไมรจะจดอยขางไหนของ root) เราจะเรยงสมาชกไดเปน 3,2,4,1,6,7

การคนหาในแนวกวาง (breadth-first search) วธการสามแบบแรกทกลาวมาขางตนนน เปนวธการคนหาในแนวลก (depth-first search) ซงถามการด subtree ใดแลวจะตองตรวจสอบทง subtree นนใหเสรจ จงจะสารวจ root หรอ subtree อนๆทเปน sibling ตอไปได วธการตรวจสอบแบบ breadth-first จะตรวจสอบทละระดบของ tree โดยเรมจากระดบของ root ดงนน tree ในรป 6.4 จะมการเรยงสมาชกไดเปน 1,2,5,6,3,4,7 แนวคดในการเขยนโปรแกรมเพอทาการคนหาแบบนกจะตางจากสามแบบแรกอยางสนเชง สาหรบสามแบบแรกนน ถาเรารวาจะทาตนไมของเราแบบใดเรากสามารถประยกตใช recursion ไดอยางไมยากนก แตการคนตนไมเปนระดบๆนนยากทจะใช recursion ดงนนจงมการนาแถวคอย (คว) เขามาชวย โดยตอนทดโนดโนดหนง เราจะบนทก child ของโนดนนลงในควทสรางไวสาหรบเกบโนด ในระดบถดลงมา (next level queue) เชน ถาเรามตนไม expression tree ของ (a+(b*c))*(d-e) ดงรป 6.5

Page 6: aj.vishnu - Tree02vishnu/datastructure/aj.vishnu - Tree02.pdf · 196 โครงสร างต นไม วิศวกรรมคอมพ ิวเตอร จุฬาฯ

200 โครงสรางตนไม วศวกรรมคอมพวเตอร จฬาฯ

รป 6.5 expression tree

ขนตอนการทาการคนหาในแนวกวางจะเปนดงน 1. เมอเราด root เราจะบนทก child โนด ของ root ไวบน next level queue ดงนน ในขนน

next level queue ม + กบ – 2. update ให this level queue = next level queue แลว เคลยร next level queue 3. สารวจ this level queue จะพบ + เปนตวแรก ตอนนใหดตวตนไมแลวใสลกของ + ลง

ใน next level queue นนคอ ในตอนน next level queue = a,* 4. สารวจ this level queue ตอ จะพบ – เปนสมาชกตวตอมา ใสลกของ - ลงใน next level

queue นนคอ ในตอนน next level queue = a,*,d,e 5. ไมมสมาชกใน this level queue แลว ดงนน update ให this level queue = next level

queue นนคอ this level queue = a,*,d,e 6. เรมเยยม this level queue ตงแตตนอกครง และทาซาไปเรอยๆ

จะเหนไดวาเราไดสารวจสมาชกของตนไมนเรยงตามระดบจรงๆ

d

-

e

*

a

+

*

c b

Page 7: aj.vishnu - Tree02vishnu/datastructure/aj.vishnu - Tree02.pdf · 196 โครงสร างต นไม วิศวกรรมคอมพ ิวเตอร จุฬาฯ

Data Structure โครงสรางตนไม 201

แบบฝกหด

1. จงเรยงสมาชกในตนไมตอไปนแบบ preorder inorder และ postorder

2. จงเรยงสมาชกของตนไมจากรป 6.5 แบบ preorder inorder และ postorder

3. ถาม postfix notation abc*+de-*

จงเสนอวธการทา postfix notation น ใหเปน expression tree

4. จงสราง Java class ท เปนตนไมในแบบของรป 6.3 ขนมา

ตนไมแบบทวภาค (Binary Tree) เปนตนไมทแตละ โนด มกงออกไปไดมากทสดสองกง ดงนนอาจมกงเดยวในทกระดบกได ซงกจะกลายเปน linked list ไป หรออาจเรยกอกอยางไดวา skewed tree หรอ chain ดงรป 6.6

a

c t

o d e n

f k s m g l

Page 8: aj.vishnu - Tree02vishnu/datastructure/aj.vishnu - Tree02.pdf · 196 โครงสร างต นไม วิศวกรรมคอมพ ิวเตอร จุฬาฯ

202 โครงสรางตนไม วศวกรรมคอมพวเตอร จฬาฯ

รป 6.6 Skewed tree

สวน binary tree ทเปนรปสามเหลยมอยางสมบรณ ไมขาด leaf ใดๆในระดบของ leaf ทสงทสด เราเรยกวาเปนตนไมแบบเตมตน (full binary tree หรอ perfectly balanced tree) ดงรป 6.7

รป 6.7 ตนไมแบบเตมตน

สวน binary tree ทเตมถงระดบกอน leaf ทสงทสดแตระดบของ leaf ทสงทสดอาจไมเตม (แตยงม leaf เตมใสตนจากซายไปขวา) เรยกวา ตนไมบรบรณ (complete tree) ดงรป 6.8

รป 6.8 ตนไมบรบรณ

A

E

O

N

X T

Page 9: aj.vishnu - Tree02vishnu/datastructure/aj.vishnu - Tree02.pdf · 196 โครงสร างต นไม วิศวกรรมคอมพ ิวเตอร จุฬาฯ

Data Structure โครงสรางตนไม 203

ตนไมแบบเตมตนถอวาเปนตนไมบรบรณแนนอน แตตนไมบรบรณไมจาเปนตองเตมตน มขอสงเกตอกอยางคอ ถาเราเอาสมาชกของตนไมบรบรณใสในอารเรย โดยเรยงใสแบบตามแนวกวาง (breadth-first) สมาชกทตาแหนง i จะมลกซายอยทตาแหนง 2i+1 และลกขวาอยทตาแหนง 2i+2 สวนตว parent ของ i จะอยทตาแหนง (i-1)/2 (ปดทศนยมทงไป) ตวอยางเชนถานาตนไมในรป 6.8 มาใสในอารเรย เราจะได A N E T O X จากอารเรยน index ของ E คอ 2 จากกฎขางตน ลกซายของ E จะตองม index =2*2+1 =5 ซงกคอ X นนเอง เปนไปตามทมในตนไมจรงๆ สวน parent ของ E กจะม index = (2-1)/2 = 0 เมอปดลงแลว ซงกเปนจรงตามทมในตนไม นอกจากนยงม binary tree อกแบบทจะตองเปน empty tree หรอไมกม non-leaf node ทตองมสองกงเทานน binary tree แบบนเราเรยกวา two-tree จากรป 6.8 ถาเราตด โนด ทม X ทงไป ตนไมในรปกจะเปน two-tree และจากนยามของ two-tree ตนไมแบบเตมตนจะตองเปน two-tree แนๆ (แต two-tree ไมจาเปนตองเตมตน)

ทฤษฎตางๆของตนไมทวภาค ถาเราให • leaves(t) แทนฟงกชนทบอกจานวนใบของตนไม t • n(t) เปนจานวน โนด ของ ตนไม t • height(t) เปนความสงของตนไม t • leftsubtree(t) เปนตนไมยอยดานซายของ t • rightsubtree(t) เปนตนไมยอยดานขวาของ t • max(a,b) เปนคาทมากทสดเมอเทยบ a กบ b สาหรบตนไมทวภาคทไมใชตนไมวาง จะมความสมพนธระหวางฟงกชนตางๆดงน

Page 10: aj.vishnu - Tree02vishnu/datastructure/aj.vishnu - Tree02.pdf · 196 โครงสร างต นไม วิศวกรรมคอมพ ิวเตอร จุฬาฯ

204 โครงสรางตนไม วศวกรรมคอมพวเตอร จฬาฯ

นยามท 6-1

0.21)()( +

≤tntleaves

นยามท 6-2

)(20.2

1)( theighttn≤

+

นยามท 6-3

ถา t เปน two-tree แลวละก 0.2

1)()( +=

tntleaves

นยามท 6-4

ถา 0.2

1)()( +=

tntleaves แลวละก t เปน two-tree แนนอน

นยามท 6-5

ถา t เปนตนไมแบบเตมตน แลวละก )(20.2

1)( theighttn=

+

นยามท 6-6

ถา )(20.2

1)( theighttn=

+ แลวละก t เปนตนไมแบบเตมตน

อยาลมวาเราใช 2.0 เพราะฉะนนคาจากสตรเหลานผมจะถอวาเปนทศนยมนะ เพราะจานวนเตมจะใชกบกฎขอ 4 ไมได ลองสงเกตดจากรป 6.9 ถาเราใชจานวนเตม leaves(t) กจะมคา (n(t)+1)/2 แตเราเหนไดชดวาตนไมในรปนไมใช two-tree

Page 11: aj.vishnu - Tree02vishnu/datastructure/aj.vishnu - Tree02.pdf · 196 โครงสร างต นไม วิศวกรรมคอมพ ิวเตอร จุฬาฯ

Data Structure โครงสรางตนไม 205

รป 6.9 ตนไมทผดกฎขอ 4 เพราะเราใชจานวนเตม

กฎทกขอสามารถพสจนไดดวยวธอปนยทางคณตศาสตร (math induction) โดยใชความสงของตนไมเปนหลก

พสจนนยาม 6-1

0.21)()( +

≤tntleaves

base case คอเมอ t เปน ตนไมทมแตราก 1)( =tleaves

1 2.0

1n(t)=

+ ซงเหนชดวาทาใหสมการเปนจรง

inductive case คอ เมอ t เปนตนไมทสง h

ให 0.2

1)()( +≤

tntleaves

สงทตองพสจน คอ เมอ t เปนตนไมทสง h+1 แลว 0.2

1)()( +≤

tntleaves

ในกรณน เราได

2.0

1tree(t))n(rightsub 0.2

1ree(t))n(leftsubt

t))htsubtree(leaves(rig))tsubtree(tleaves(lef leaves(t)+

++

+=

โดยแทนคาจาก inductive case ลงไปได เพราะ leftsubtree กบ rightsubtree ของ t เปนตนไมทสง h

A

E

O

N

Page 12: aj.vishnu - Tree02vishnu/datastructure/aj.vishnu - Tree02.pdf · 196 โครงสร างต นไม วิศวกรรมคอมพ ิวเตอร จุฬาฯ

206 โครงสรางตนไม วศวกรรมคอมพวเตอร จฬาฯ

เรารวา 1 tree(t))n(rightsub ree(t))n(leftsubt n(t) ++= เพราะฉะนนเราสามารถแทนคา n(t) ลงไปในอสมการได ผลคอได

0.21)()( +

≤tntleaves

ซงเปนสงทเราตองการพสจนจรงๆ

พสจนนยาม 6-2 height(t)2

2.01n(t)≤

+

base case คอเมอ t เปน ตนไมทมแตราก

1 2.0

1n(t)=

+

1 2 2 0height(t) == ซงเหนชดวาทาใหสมการเปนจรง inductive case คอ เมอ t เปนตนไมทสง h

ให height(t)2 2.0

1n(t)≤

+

สงทตองพสจน คอ เมอ t เปนตนไมทสง h+1 แลว height(t)2 2.0

1n(t)≤

+

ในกรณนเราไดคา

)(

1)))(()),((max(

)))(()),((max(

))(())((

22

2*222

0.21tree(t))n(rightsub

0.21ree(t))n(leftsubt

2.011tree(t))n(rightsubree(t))n(leftsubt

2.01n(t)

theight

teerightsubtrheightteleftsubtreheight

teerightsubtrheightteleftsubtreheight

teerightsubtrheightteleftsubtreheight

+≤

++

+=

+++=

+

+

ซงไดตามทเราตองการพสจน

Page 13: aj.vishnu - Tree02vishnu/datastructure/aj.vishnu - Tree02.pdf · 196 โครงสร างต นไม วิศวกรรมคอมพ ิวเตอร จุฬาฯ

Data Structure โครงสรางตนไม 207

พสจนนยาม 6-3 ถา t เปน two-tree แลวละก

0.21)()( +

=tntleaves

base case คอเมอ t เปน ตนไมทมแตราก 1)( =tleaves

1 2.0

1n(t)=

+ ซงเหนชดวาทาใหสมการเปนจรง

inductive case คอ เมอ t เปน two-tree ทสง h

ให 0.2

1)()( +=

tntleaves

สงทตองพสจน คอ เมอ t เปน two-tree ทสง h+1 ในกรณนเมอเราดท t t))htsubtree(leaves(rig ))tsubtree(tleaves(lef leaves(t) +=

เพราะวา ทง leftsubtree(t) และ rightsubtree(t) ตางกเปน two-tree ดงนน จาก inductive case เราจะไดวา

2.0

1tree(t))n(rightsub 0.2

1ree(t))n(leftsubt leaves(t) ++

+=

เรารวา 1 tree(t))n(rightsub ree(t))n(leftsubt n(t) ++= ดงนนแทนคานลงไปในสมการของ leaves(t) จะได

0.21)()( +

=tntleaves ตามนยาม

แบบฝกหด

1. จงพสจนนยามท 6-4 ถง 6-6 จากนยามท 6-5 และ 6-6 เราจะเหนวาการเกบขอมลในตนไมในรปแบบเตมๆนน

Page 14: aj.vishnu - Tree02vishnu/datastructure/aj.vishnu - Tree02.pdf · 196 โครงสร างต นไม วิศวกรรมคอมพ ิวเตอร จุฬาฯ

208 โครงสรางตนไม วศวกรรมคอมพวเตอร จฬาฯ

ม )(20.2

1)( theighttn=

+

ซงเขยนใหมไดเปน

)(1)1)((log

2log)0.2

1)((log

2

)(22

theighttn

tn theight

=−+

=+

เพราะฉะนน ความสงของตนไมทวภาคซงเราพยายามเตมใหเตมทสดนนจะเปน log ของจานวน โนด ซงนกคอตวกาหนดเวลาในการเอาสมาชกเขา/ออกจากตนไม ยงมอกนยามอกชดหนงทนาสนใจคอ

นยามท 6-7

External Path Length

ให t เปนตนไมทวภาคทมราก จะไดวา External Path length, E(t) คอผลบวกของความลกของทกใบ จากรป 6.5 คา E(t) จะเปน 2+3+3+2+2=12

นยามท 6-8

ถา t เปนตนไมทวภาคทมจานวนใบเปน k (ซงมากกวา 0) จะไดวา

⎣ ⎦kktE 2log)2/()( ≥ พสจนโดย กอนอน พสจนโดยอปนยทางคณตศาสตรวา ทระดบ L มจานวนใบทเปนไปไดมากทสดคอ

L2 (ขอไมแสดงสวนน)

Page 15: aj.vishnu - Tree02vishnu/datastructure/aj.vishnu - Tree02.pdf · 196 โครงสร างต นไม วิศวกรรมคอมพ ิวเตอร จุฬาฯ

Data Structure โครงสรางตนไม 209

ทระดบตากวา L จะมจานวนใบ ไมถง L2 แนนอน ถาให L เปน ⎣ ⎦ 1log2 −k จะไดวาทระดบตากวา L จะมจานวนใบ

⎣ ⎦

2/22

1log

1log

2

2

k

k

k

≤≤

≤−

และทระดบสงกวา L (นนคออยระดบ ⎣ ⎦k2log ขนไป) จะมจานวนใบอยางนอย k/2 เพราะวา E(t) คอผลบวกของความลกของทกใบ ฉะนน

⎣ ⎦ 2*log)( 2

kktE ≥ เปนไปตามนยาม

แนวคดในการเขยนโปรแกรมสรางตนไมทวภาค เรามาดกนวาตนไมชนดนควรมอะไรเปนสวนประกอบ กอนอน ตวตนไมควรประกอบดวยสามสวนคอ

1. root 2. left subtree 3. right subtree

ตนไมคนหาแบบทวภาค (Binary Search Tree)

Binary Search Tree t คอ binary tree ซงเปน empty tree หรอเปนตนไมซง 1. ทกสมาชกใน leftsubtree(t) มคานอยกวาสมาชกทรากของ t 2. ทกสมาชกใน rightsubtree(t) มคามากกวาสมาชกทรากของ t 3. ทง leftsubtree(t) และ rightsubtree(t) ตางกเปน binary search tree

Page 16: aj.vishnu - Tree02vishnu/datastructure/aj.vishnu - Tree02.pdf · 196 โครงสร างต นไม วิศวกรรมคอมพ ิวเตอร จุฬาฯ

210 โครงสรางตนไม วศวกรรมคอมพวเตอร จฬาฯ

จะสงเกตไดวานยามของเราไมมการนบคาทซาเขาไปใน tree อก รป 6.10 แสดง binary search tree ของจานวนเตม

รป 6.10 binary search tree

การเรยงสมาชกแบบนจะทาใหสบคนไดงาย เชน จากในรป 6.10 ถาเราตองการหาวา 4 อยในตนไมหรอไม เมอเราด โนด แตละ โนด เราสามารถรไดทนทวาจะไปสารวจตนไมขางใดตอไป ทาใหเวลาในการคนหาขนอยกบความสงของตนไมเทานน ซงกแปรตาม log ของจานวนโนดอกทหนง

แนวคดในการเขยนโปรแกรมสรางตนไมคนหาแบบทวภาค

กอนอนเรามานยามโนดหนงอนเสยกอน รปแบบของ โนดจะใชตามโคดรป 6.11 โดยสวนทเปนโนดนน ประกอบดวย

• element ซงเปนขอมลภายในโนดนน • left ซงเปนโนดทเปนโนดรากของตนไมยอยขางซาย • right ซงเปนโนดทเปนโนดรากของตนไมยอยขางขวา

7

11

146

5

2

4

Page 17: aj.vishnu - Tree02vishnu/datastructure/aj.vishnu - Tree02.pdf · 196 โครงสร างต นไม วิศวกรรมคอมพ ิวเตอร จุฬาฯ

Data Structure โครงสรางตนไม 211

1: class BinaryNode 2: // Constructors 3: BinaryNode(Comparable theElement) 4: this( theElement, null, null ); 5: 6: 7: BinaryNode(Comparable theElement, BinaryNode lt, BinaryNode rt ) 8: element = theElement; 9: left = lt; 10: right = rt; 11: 12: 13: // ขอมลของโนดน 14: Comparable element; // ขอมลภายในโนด 15: BinaryNode left; // ลกขางซาย 16: BinaryNode right; // ลกขางขวา 17:

รป 6.11 โคดของสวนทเปนโนด

เพอใหสมาชกของตนไมเปรยบเทยบกนไดงายไมวามาจากคลาสใดกตาม ผมจะกาหนดใหสมาชกแตละตวเปน object ของคลาส ท implements Comparable interface (รป 6.12) 1: public interface Comparable 2: /** 3: * @return จานวนเตมทนอยกวาศนย ถา this มคานอยกวา x 4: * return จานวนเตมทมากกวาศนย ถา this มคามากกวา x 5: * ไมงนก return ศนย 6: */ 7: public int compareTo(Object x); 8:

รป 6.12 Comparable interface

สาหรบในจาวาเองกมคลาสท implements Comparable อยแลวนนคอ String ดงนนถาเราม 1: String s = “men”; 2: int x = s.compareTo(“man”);

รป 6.13 ตวอยางการใชงาน Comparable interface

คาทโคดน return จะมากกวา 0 เพราะ men มาทหลง man เรยงตามในพจนานกรม คาจรงๆนนคอ 4 เพราะ e กบ a หางกน 4 ตาแหนง

Page 18: aj.vishnu - Tree02vishnu/datastructure/aj.vishnu - Tree02.pdf · 196 โครงสร างต นไม วิศวกรรมคอมพ ิวเตอร จุฬาฯ

212 โครงสรางตนไม วศวกรรมคอมพวเตอร จฬาฯ

เมธอดตางๆของคลาส BinarySearchTree ของเรา จะเปนดงรป 6.14 1: // Comparable find( x ) --> หา x แลวรเทรนออกมา 2: // Comparable findMin( ) --> หาของทคานอยสด 3: // Comparable findMax( ) --> หาของทคามากสด 4: // void insert( x ) --> ใส x 5: // void remove( x ) --> เอา x ออก 6: // boolean isEmpty( ) --> true ถาเปนตนไมเปลาๆ ไมงนกfalse 7: // void makeEmpty( ) --> เอาของออกจากตนไมหมด 8: // void printTree( ) --> พมพสมาชก เรยงจากนอยไปมาก

รป 6.14 เมธอดของ binary search tree

ตวของตนไมเองเราสรางจากแค โนด ทเปนรากเทานน (อาจใหมตวแปร size เกบจานวน โนด ทงหมดอกตวหนง) ลงคทออกจากรากไปจะตอไปยงสวนตางๆของตนไมเอง ฉะนนโครงสรางของคลาสของเราจะเปนดงรป 6.15 1: public class BinarySearchTree 2: private BinaryNode root; 3: 4: //เมธอด ตางๆ…

รป 6.15 โครงสรางของคลาส binary search tree

รป 6.16 แสดงตนไมของขอมลในพจนานกรมภาษาไทยทสรางขนมาโดยใชคลาสน

Page 19: aj.vishnu - Tree02vishnu/datastructure/aj.vishnu - Tree02.pdf · 196 โครงสร างต นไม วิศวกรรมคอมพ ิวเตอร จุฬาฯ

Data Structure โครงสรางตนไม 213

รป 6.16 ตนไมตวอยาง

รายละเอยดของเมธอดตางๆของตนไมทวภาค เราเรมจากอนทงายกอนเลยนะ คอตว constructor ดรป 6.17 (เรายงอยในคลาส BinarySearchTree อยนะ) 1: public BinarySearchTree( ) 2: root = null; 3:

รป 6.17 constructor ของ binary search tree

ตอไปจะเปนเมธอดทตรวจดของเขาไปในตนไม แลวรเทรนของนนออกมาถาหาเจอ หรอรเทรน null ถาหาของชนนนไมเจอ นคอเมธอด find สาหรบเมธอดนนนมแนวคดในการเขยนดงน

• เมอเราเรมด โนดโนด หนง (ราก จะเปนโนดแรกทด) o ถา โนด ทเราด เปน null ให return null เลย o ถา element ใน โนด นน นอยกวา x ใหเปลยนไปดท โนด ลกขวาของมน o ถา element ใน โนด นน มากกวา x ใหเปลยนไปดท โนด ลกซายของมน

root

เดก

จก n n

บน n nไก n

Page 20: aj.vishnu - Tree02vishnu/datastructure/aj.vishnu - Tree02.pdf · 196 โครงสร างต นไม วิศวกรรมคอมพ ิวเตอร จุฬาฯ

214 โครงสรางตนไม วศวกรรมคอมพวเตอร จฬาฯ

o ถา element ใน โนด นน เทากบ x ให รเทรนโนดทม x นนเลย ตวโคดอยในรป 6.18 ซงเปนการหา x โดยเรมหาจากโนด t 1: private BinaryNode find( Comparable x, BinaryNode t ) 2: if( t == null ) 3: return null; 4: if( x.compareTo( t.element ) < 0 ) 5: return find( x, t.left ); 6: else if( x.compareTo( t.element ) > 0 ) 7: return find( x, t.right ); 8: else 9: return t; //เจอแลว 10:

รป 6.18 เมธอด find

ซงตอนใชงานจรง เรารเทรน Comparable และกเรมหาจากรากดวย ดงนนตองมการปรบโดยเขยนโปรแกรมเพมเตมเลกนอย ดงทเหนในรป 6.19 โดยเมธอดทโอเวอรโหลด find นนบงคบใหเรมหาจากราก แลวจากนนใหหาของขางในโนดออกมาอกท ดวยเมธอด elementAt 1: public Comparable find( Comparable x ) 2: return elementAt( find( x, root ) ); 3: 4: 5: private Comparable elementAt( BinaryNode t ) 6: return t == null ? null : t.element; 7:

รป 6.19 โคดเพมเตมเพอการใชงานทถกตองของ find

จรงๆโคดในรป 6.18 จะเขยนแบบลปกได ลปนนจะเรวและกนทในหนวยความจานอยกวา recursion แบบฝกหด

1. จงเขยนเมธอด find ดวยการใชลป

Page 21: aj.vishnu - Tree02vishnu/datastructure/aj.vishnu - Tree02.pdf · 196 โครงสร างต นไม วิศวกรรมคอมพ ิวเตอร จุฬาฯ

Data Structure โครงสรางตนไม 215

ในเรองของเวลานน เวลาทแยทสดจะเกดเมอเราสารวจ skewed tree ซงจะแปรตามจานวน โนด สวนเวลาโดยเฉลย เราคดโดย กอนอนดทตนไมแบบเตมตนกอน จากนยามท 6-8

⎣ ⎦kktE 2log)2/()( ≥ k คอจานวนใบ และ E(t) คอผลบวกของความลกของทกใบ ดงนนเวลาโดยเฉลยในการสารวจตนไมเตมตนกตองเปน E(t) หารดวย k

⎣ ⎦k

kkktE 2log)2/()(≥

จากนยาม 6-3 เรารวาตนไมแบบเตมตนจะม 0.2

1)()( +=

tntleaves นนคอ เราแทนคานแทน

k ได

⎥⎦⎥

⎢⎣⎢ +

≥ )0.2

1)((log5.0)(2

tnktE

นนคอ เวลานจะมากกวาหรอเทากบฟงกชนของ ))((log2 tn อยาลมวานคอตนไมแบบเตมตน ถาเปนตนไมทวภาคแบบธรรมดา เวลากตองนานกวาน ซงอสมการจะยงคงเดม เราสรปไดวาเวลาเฉลย = )(log2 nΩ เมอ n เปนจานวน โนด มาลองดอกสกเมธอดทใชในการหาของในตนไม สมมตวาเราตองการจะหาคาสมาชกทนอยทสดในตนไม แนนอนวาสมาชกตวนจะตองอยในโนดซายสด เราสามารถเขยนโคดไดดงรป 6.20 โดยตอนทเรยกใชกใหเรมคนหาจาก โนด ทเปน root ซงจะเหมอนกบในกรณของ find คอ เราเขยนเมธอดทเรมหาจากโนดใดกไดโนดหนงกอน จากนนจงเขยนอกเมธอดหนงซงกาหนดใหโนดทจะเรมหาเปน root แลวหาคาออกมา

Page 22: aj.vishnu - Tree02vishnu/datastructure/aj.vishnu - Tree02.pdf · 196 โครงสร างต นไม วิศวกรรมคอมพ ิวเตอร จุฬาฯ

216 โครงสรางตนไม วศวกรรมคอมพวเตอร จฬาฯ

1: private BinaryNode findMin( BinaryNode t ) 2: if( t == null ) 3: return null; 4: else if( t.left == null ) 5: return t; 6: return findMin( t.left ); 7: 8: 9: public Comparable findMin( ) 10: return elementAt( findMin( root ) ); 11:

รป 6.20 เมธอดหาคานอยทสดในตนไม

การหาคาทมากทสดกเชนเดยวกน ดงแสดงในรป 6.21 แตตวอยางนจะเปนการทาโดยใชลปแทนเพอใหเหนตวอยางทชดเจน 1: private BinaryNode findMax( BinaryNode t ) 2: if( t != null ) 3: while( t.right != null ) 4: t = t.right; 5: return t; 6: 7: 8: public Comparable findMax( ) 9: return elementAt( findMax( root ) ); 10:

รป 6.21 เมธอดหาคามากทสดในตนไม

แบบฝกหด

1. จงเขยนเมธอด findMin เสยใหมดวยการใชลป

2. จงเขยนเมธอด findMax เพอหาคาสมาชกทมากทสดในตนไม โดยไมใชลป คราวนมาด insert บาง หลกการจะเหมอนกบ find เลย หลกการคอ

Page 23: aj.vishnu - Tree02vishnu/datastructure/aj.vishnu - Tree02.pdf · 196 โครงสร างต นไม วิศวกรรมคอมพ ิวเตอร จุฬาฯ

Data Structure โครงสรางตนไม 217

ถาหา x ไปทงตนแลวยงไมเจอ (เจอ null เปนตวสดทายนนเอง)ใหเอา x ใสไวในทๆ มนควรอย (สรางโนดใหมโดยม x อยขางใน แลวเอาโนดนนใสแทน null ตวทเจอ) สวนในการ return นนจะ return โนดทเราใชเรมคน(แตสภาพตนไมจะเปนหลงจากได insert x แลวนนเอง) นอกจากนยงมเมธอด insert อกตวหนง ซงเปนตวบอกวา การคนนนจะเรมจาก root โปรดสงเกตวาถาม x อยแลว เมธอด insert จะไมทาอะไร โคดของเมธอด insert ทงสองเมธอดนนอยในรป 6.22 1: private BinaryNode insert(Comparable x,BinaryNode t ) 2: 3: if( t == null ) 4: t = new BinaryNode( x, null, null ); 5: else if( x.compareTo( t.element ) < 0 ) 6: t.left = insert( x, t.left ); 7: else if( x.compareTo( t.element ) > 0 ) 8: t.right = insert( x, t.right ); 9: else 10: ; // Duplicate; do nothing 11: return t; 12: 13: 14: public void insert( Comparable x ) 15: 16: root = insert( x, root ); 17:

รป 6.22 โคดของ insert

สวนการเอาของออกจากตนไมนน ทาดวยเมธอด remove ซงหลกการจะคลายกบการ insert คอ • ถาโนดทเราเรมหา เปน null อยแลว กไมตองทาอะไร • ถา x ทเราตองการหา มคานอยกวาสมาชกทอยในโนดทเรากาลงสนใจอยในปจจบน

ใหไปลบ x ออกจากกงซาย • ถา x ทเราตองการหา มคามากกวาสมาชกทอยในโนดทเรากาลงสนใจอยในปจจบน

ใหไปลบ x ออกจากกงขวา • ถา x ทเราตองการหา มคานอยเทากบสมาชกทอยในโนดทเรากาลงสนใจอยใน

ปจจบน ดวา o ถากงยอยทงซายและขวาไมเปนกงวาง ใหเอาสมาชกตวทนอยทสดของกง

ขวาขนมาแทนท x จากนนเอาสมาชกตวนนออกจากกงขวา (ดรป 6.23) (จรงๆแลวอาจจะเอาสมาชกทคามากทสดของกงซายมาแทน x กได)

Page 24: aj.vishnu - Tree02vishnu/datastructure/aj.vishnu - Tree02.pdf · 196 โครงสร างต นไม วิศวกรรมคอมพ ิวเตอร จุฬาฯ

218 โครงสรางตนไม วศวกรรมคอมพวเตอร จฬาฯ

o ถากงยอยซายหรอขวากงใดกงหนงวาง ใหเอากงขางทมอยขนมาแทนโนดทม x (รป 6.24)

• หลงจากการทาทกอยางเสรจสน รเทรนโนดทเราสนใจตอนแรกออกมา

รป 6.23 เอาสมาชกคานอยทสดของกงขวาขนมาแทนสมาชกตวทถกลบ

รป 6.24 การเอา subtree ขนมาแทนทโนดทถกลบ

โคดของการ remove นอยในรป 6.25 โดยมเมธอดทสอง ทกาหนดวาตองเรมหาจาก root ใหมาดวย แบบฝกหด

1. จงเขยนเมธอด insert เสยใหมดวยการใชลป

2. จงเขยนเมธอด remove ใหมดวยการใชลป

3. จงเขยนเมธอด removeMin ซงลบคาทนอยทสดออกจากตนไม

x

y

y

y

x

y

y

Page 25: aj.vishnu - Tree02vishnu/datastructure/aj.vishnu - Tree02.pdf · 196 โครงสร างต นไม วิศวกรรมคอมพ ิวเตอร จุฬาฯ

Data Structure โครงสรางตนไม 219

1: /* Internal method to remove from a subtree. 2: * @param x the item to remove. 3: * @param t the node that roots the tree. 4: * @return the new root. 5: */ 6: private BinaryNode remove(Comparable x,BinaryNode t ) 7: 8: if( t == null ) 9: return t; // Item not found; do nothing 10: if( x.compareTo( t.element ) < 0 ) 11: t.left = remove( x, t.left ); 12: else if( x.compareTo( t.element ) > 0 ) 13: t.right = remove( x, t.right ); 14: else if( t.left != null && t.right != null ) 15: 16: t.element = findMin( t.right ).element; 17: t.right = remove( t.element, t.right ); 18: 19: else 20: t = ( t.left != null ) ? t.left : t.right; 21: 22: return t; 23: 24: 25: public void remove( Comparable x ) 26: 27: root = remove( x, root ); 28:

รป 6.25 โคดของ remove

มากนทเมธอดชดถดไป เมธอด makeEmpty นน ทาใหตนไมกลายเปนตนไมวาง ดวยการ ตงให root เปน null ไปเสย สวนเมธอด isEmpty นนกตรวจวาตนไมวางหรอไม โดยดจาก root วาเปน null หรอไม นนเอง สองเมธอดนอยในรป 6.26 1: public void makeEmpty( ) 2: root = null; 3: 4: 5: public boolean isEmpty( ) 6: return root == null; 7:

รป 6.26 โคดของ makeEmpty และ isEmpty

Page 26: aj.vishnu - Tree02vishnu/datastructure/aj.vishnu - Tree02.pdf · 196 โครงสร างต นไม วิศวกรรมคอมพ ิวเตอร จุฬาฯ

220 โครงสรางตนไม วศวกรรมคอมพวเตอร จฬาฯ

เมธอดชดสดทายทเราจะกลาวถงกน คอ เมธอดทใชในการพมพสมาชกทอยในตนไมออกมา โดยพมพเรยงลาดบจากนอยไปมาก ซงการทางานของเมธอดนไมมอะไรซบซอนเลย เพยงแคเรยกเมธอดเดมเพอทาการพมพจาก left subtree กอน แลวจงพมพของทอยใน root จากนนจงเรยกเมธอดเดมอกครงเพอทาการพมพจาก right subtree โคดของเมธอดนอยในรป 6.27 1: /** 2: * Internal method to print a subtree in sorted order. 3: * @param t the node that roots the tree. 4: */ 5: private void printTree( BinaryNode t ) 6: if( t != null ) 7: printTree( t.left ); 8: System.out.println( t.element ); 9: printTree( t.right ); 10: 11: 12: 13: public void printTree( ) 14: if( isEmpty( ) ) 15: System.out.println( "Empty tree" ); 16: else 17: printTree( root ); 18:

รป 6.27 โคดของการพมพสมาชกในตนไมออกมา

ตอไปจะเปนตวอยางโคดทแสดงถงการทางานของตนไมทเรานยาม คาอธบายนนแทรกเปนคอมเมนตระหวางบรรทดในโคด ขอใหดรป 6.28

Page 27: aj.vishnu - Tree02vishnu/datastructure/aj.vishnu - Tree02.pdf · 196 โครงสร างต นไม วิศวกรรมคอมพ ิวเตอร จุฬาฯ

Data Structure โครงสรางตนไม 221

1: public static void main(String[ ] args) 2: //สรางตนไม 3: BinarySearchTree t = new BinarySearchTree( ); 4: final int NUMS = 4000; 5: final int GAP = 37; 6: 7: System.out.println( "Checking... (no more output means success)" ); 8: 9: //ใสของเขาไปในตนไม โดยใสตวเลขเพมทละ 37 แลวmod 4000 ใสจนกวาจะ mod ได 0 10: for( int i = GAP; i != 0; i = ( i + GAP ) % NUMS ) 11: t.insert( new MyInteger( i ) ); 12: 13: //ลปเอาของออก เอาเลขคออกจากตนไมใหหมด 14: for( int i = 1; i < NUMS; i+= 2 ) 15: t.remove( new MyInteger( i ) ); 16: 17: if( NUMS < 40 ) 18: t.printTree( ); 19: 20: //ถาคาทนอยทสดในตนไมไมเปนสอง หรอ คาทมากทสด ไมเปน NUMS-2 จะตองแจงใหร 21: if( ((MyInteger)(t.findMin( ))).intValue( ) != 2 || 22: ((MyInteger)(t.findMax())).intValue()!=NUMS - 2 ) 23: 24: System.out.print(“FindMin or FindMax error" ); 25: System.out.println(); 26: 27: 28: //ลองหาคาเลขคในออบเจกต แตถาคาไมตรง แสดงวา การหานนผด หรอไมกการใสนนผด 29: for( int i = 2; i < NUMS; i+=2 ) 30: if(((MyInteger)(t.find(new MyInteger(i) 31: ))).intValue()!=i ) 32: System.out.println( "Find error1!" ); 33: //ลองหาคาเลขค แตถาเจอ แสดงวา ทเอาออกตอนแรกนนทาไมสาเรจ ตองแจง error 34: for( int i = 1; i < NUMS; i+=2 ) 35: 36: if( t.find( new MyInteger( i ) ) != null ) 37: System.out.println( "Find error2!" ); 38: 39:

รป 6.28 โปรแกรมตวอยางการใชงาน binary search tree

Page 28: aj.vishnu - Tree02vishnu/datastructure/aj.vishnu - Tree02.pdf · 196 โครงสร างต นไม วิศวกรรมคอมพ ิวเตอร จุฬาฯ

222 โครงสรางตนไม วศวกรรมคอมพวเตอร จฬาฯ

สาหรบเรองตนไมนน เราจะเรยนกนแคน ในบทตอไปเราจะมาเรยนเรองตนไมแบบพเศษ ทเรยกวา ตนไมแบบ AVL แบบฝกหด

1. จงอธบายวา binary search tree คออะไร

2. จงเปรยบเทยบ binary search tree กบ linked list

3. ม binary search tree อกรปแบบหนงทเราสามารถบงคบความเรวในการคนไดในระดบหนง จงอธบายวา binary search tree แบบนนเปนอยางไร

4. จงเขยนเมธอดของ binary search tree ตอไปน

public LinkedList inOrder(BinaryNode t)

ซงใสของในตนไม (ตนไมม root ท t) เขาไปใน linked list โดยจดเรยงแบล inorder

5. จงเขยนเมธอดของ binary search tree ตอไปน

public LinkedList breadthFirst(BinaryNode t)

ซงใสของจากตนไม (ตนไมม root ท t) เขาไปใน linked list โดยจดเรยงแบบ breadth first

6. จงเขยนเมธอด isBST เพอทดสอบวา tree ทเปน input เปน binary search tree หรอไม

public Boolean isBST(BinaryNode t)

7. จงวาดรปแสดงการทางานของโปรแกรมในรป 6.28 ลด NUMS ใหเหลอจานวนนอยๆกพอ

8. จงเขยนเมธอด add2Tree ซงรบ ตนไมคนหาแบบทวภาค(binary search tree) สองตนทมสมาชกประเภทเดยวกน แลวรวมสองตนนเขาดวยกน รเทรนตนไมตนใหมทเปนผลรวมของสองตน โดยไมเปลยนตนไมตนฉบบ

9. จงเขยนเมธอดเพอพมพของในตนไมจากมากไปนอย

10. จงเขยนเมธอด maxSort ซงรบตนไมคนหาแบบทวภาคเขามา แลวเปลยนการเรยงของในตนไมใหม ใหเปนจากคามากไปคานอย

Page 29: aj.vishnu - Tree02vishnu/datastructure/aj.vishnu - Tree02.pdf · 196 โครงสร างต นไม วิศวกรรมคอมพ ิวเตอร จุฬาฯ

Data Structure โครงสรางตนไม 223

11. จงนยามโนดใหม โดยใหมตวแปร parent เพอชกลบไปยงโนดพอได จากนนจงเขยนเมธอด findGrandParent ซงรบโนดเปนอนพตแลวรเทรนโนดทเปนโนด parent ขนไปสองขน

12. จงเขยนเมธอด nextValue ซงรบComparable เปนอนพต แลวรเทรนคาซงเปน Comparable ตวถดไป (ตองอยในตนไม) ออกมา

Page 30: aj.vishnu - Tree02vishnu/datastructure/aj.vishnu - Tree02.pdf · 196 โครงสร างต นไม วิศวกรรมคอมพ ิวเตอร จุฬาฯ

224 โครงสรางตนไม วศวกรรมคอมพวเตอร จฬาฯ