ต้นไม้ Tree [1] ผู้สอน อาจารย์ ยืนยง กันทะเนตร สาขาวิชาเทคโนโลยีคอมพิวเตอร์เคลื่อนที่ คณะเทคโนโลยีสารสนเทศและการสื่อสาร Website : ict.up.ac.th/yeunyong
หัวข้อวันนี้ โครงสร้างทั่วไปของต้นไม้ (Introduction) การเรียกชื่อส่วนต่างๆ ของต้นไม้ (terminology) ต้นไม้แบบทวิภาค (binary tree) คุณลักษณะของต้นไม้แบบทวิภาค การแทนต้นไม้แบบทวิภาคในคอมพิวเตอร์
root node branch ลักษณะของโครงสร้างข้อมูลแบบต้นไม้
โครงสร้างทั่วไปของต้นไม้ เป็น โครงสร้างข้อมูลแบบไม่เป็นรายการเชิงเส้น (Non-Linear Data Structure) ลักษณะคล้ายกิ่งก้านของต้นไม้ (แต่กลับหัว) ประกอบด้วยจุดยอดของต้นไม้เรียกว่า ราก (Root) จุดที่มีการแตกกิ่งก้านสาขาออกไปเรียกว่า โหนด (Node) กิ่งก้านสาขาที่เชื่อมต่อระหว่างโหนดเรียกว่า กิ่ง (Branch) หรือ ลิงค์ (Link) ส่วนย่อยของต้นไม้ ก็เป็นต้นไม้ (subtree) ทุกโหนดเป็น root ของ subtree ของตัวมันเอง
R เป็น root ของ subtree A,B,C,D A เป็น root ของ subtree E,F,G F เป็น root ของ subtree J C เป็น subtree ที่มีแต่ root C
การเรียกชื่อส่วนต่างๆ ของต้นไม้ ต้นไม้ (tree) ประกอบด้วย 1.node ส่วนเก็บข้อมูล 2.branch ใช้เชื่อม node เข้าด้วยกัน A B C node A, B, C branch AB, AC
A B C root A โหนดอื่นๆ B , C node A มี degree เท่ากับ 2 root หมายถึง node แรกของ tree A B C root A โหนดอื่นๆ B , C Degree หมายถึง จำนวน subtree ที่สัมพันธ์กับ Node นั้นๆ node A มี degree เท่ากับ 2 node B มี degree เท่ากับ 0 node C มี degree เท่ากับ 0
A B C D E root A leaf D , E , C branch node B leaf หมายถึง node ที่มีดีกรีเท่ากับ 0 A B C D E root A leaf D , E , C internal node , branch node หมายถึง node ที่ไม่ใช่ root และ leaf branch node B
parent หมายถึง node ที่มีดีกรีมากกว่า 0 (node ที่มี subtree ) C D E parent A , B child หมายถึง node ที่เป็น subtree ของ tree อื่น child B , C , D , E
A B C D E level 0 level 1 level 2 depth = 2 + 1 = 3 level หมายถึงระยะทางจาก root จนถึง node นั้นๆ level 0 A B C D E level 1 level 2 height หรือ depth ของ tree หมายถึง level สูงสุด ของ leaf บวกด้วย 1 depth = 2 + 1 = 3
A B C D F E sibling ของ B คือ C sibling ของ D คือ E และ F sibling หมายถึงโหนดที่มี parent ร่วมกัน A B C D F E sibling ของ B คือ C sibling ของ D คือ E และ F
parents children leaves internal nodes depth degree(A) degree(B) degree(H) degree(C) degree(E) A, B, F 3 B, E, F, C, D, G, H, I 2 E, C, D, G, H, I B, F 3
A B C D E F G H J K L I M N O Exercise 1 - node ที่เป็น child - node ที่เป็น parent - node ที่เป็น child - level ของ tree - height ของ tree - degree ของแต่ละโหนด - parent ของแต่ละโหนด - children ของแต่ละโหนด - sibling ของแต่ละโหนด B C D E F G H J K L I M N O 1.จาก tree ต่อไปนี้ จงหา - node ที่เป็น root - node ที่เป็น leaf - node ที่เป็น internal node
ต้นไม้แบบทวิภาค (binary tree) หมายถึง tree ที่แต่ละ node มีจำนวน subtree <= 2 ( แต่ละ node มี degree <= 2 )
Empty หรือ Null Tree
คุณลักษณะของต้นไม้แบบทวิภาค ความสัมพันธ์ระหว่างความสูง (hight) และจำนวน node ใน binary tree กำหนดให้ h เป็นความสูงของ binary tree n เป็นจำนวน node ใน binary tree ถ้าเรารู้ความสูง (h) ต้องสามารถหาจำนวน node (n) มากที่สุดและน้อยที่สุดที่เป็นไปได้ของ binary tree นั้นได้ ถ้าเรารู้จำนวน node (n) ต้องสามารถหาความสูง (h) มากที่สุดและน้อยที่สุดที่เป็นไปได้ของ binary tree นั้นได้
A B C D E F G A B D nmax = 7 nmin = 3 จะได้ว่า nmax = 2h – 1 nmin = h ถ้าเรารู้ความสูงของ binary tree = 3 A B C D E F G A B D nmax = 7 nmin = 3 จะได้ว่า nmax = 2h – 1 nmin = h
A B C D E A B C D E hmin = 3 hmax = 5 จะได้ว่า hmin = log2n + 1 ถ้าเรารู้ความจำนวน node ของ binary tree = 5 A B C D E A B C D E hmin = 3 hmax = 5 จะได้ว่า hmin = log2n + 1 hmax = n
การแทนต้นไม้แบบทวิภาคในคอมพิวเตอร์ binary tree สามารถแทนในคอมพิวเตอร์ได้ 2 แบบ คือ การแทนโดยอาศัยอาร์เรย์ ใช้อาร์เรย์ 3 อาร์เรย์ในการจัดเก็บ ใช้อาร์เรย์ 1 มิติอาร์เรย์เดียวในการจัดเก็บ การแทนโดยอาศัย pointer
การแทนโดยใช้อาร์เรย์ 3 อาร์เรย์ในการจัดเก็บ จะใช้อาร์เรย์ที่มีขนาดเท่ากันจำนวน 3 ชุด คือ data – เก็บข้อมูลในแต่ละ node left – เก็บตำแหน่งของ node ลูกทางด้านซ้ายมือ right – เก็บตำแหน่งของ node ลูกทางด้านขวามือ ถ้า node ใดไม่มี node ลูก ให้เก็บค่า -1 (แทน NULL) และใช้ตัวแปร root เก็บตำแหน่งของ node แรกใน tree
A B C D E F G H ตัวอย่าง ข้อมูลในหน่วยความจำ general binary tree root data left right A 1 1 A 2 3 2 B 6 4 B C 3 C 7 -1 4 E 8 5 5 H -1 -1 D E F 6 D -1 -1 7 F -1 -1 G H 8 G -1 -1
การแทนโดยใช้อาร์เรย์ 1 มิติอาร์เรย์เดียวในการจัดเก็บ กำหนดตำแหน่งช่องในอาร์เรย์ให้แต่ละ node โดย เริ่มตั้งแต่ level 0 , 1 , … , k ตามลำดับ แต่ละ level จะเริ่มจาก node ทางด้านซ้ายสุดไปถึงโหนดทางขวาสุด ตามลำดับ ลักษณะเป็นการนนับช่องจากบนลงล่าง, ซ้ายไปขวา การกำหนดตำแหน่งเช่นนี้จะไม่สนใจว่ามีข้อมูลของโหนดนั้นจริงหรือไม่ (Fix ตำแหน่งอาร์เรย์ไว้)
A B C D E G F H I ตัวอย่าง general binary tree 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ข้อมูลในหน่วยความจำ A B C D E - F G H I 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
จะได้ความสัมพันธ์ระหว่าง tree และ อาร์เรย์ ดังนี้ ถ้า binary tree มีความสูงเท่ากับ h จะต้องใช้อาร์เรย์ที่มีขนาด 2h – 1 ในการจัดเก็บ parent ของโหนด i ใดๆ จะอยู่ที่ตำแหน่ง i/2 ถ้า i ไม่เท่ากับ 1 left child ของโหนด i ใดๆ จะอยู่ที่ตำแหน่ง 2i right child ของโหนด i ใดๆ จะอยู่ที่ตำแหน่ง 2i + 1
การแทนโดยอาศัย pointer เป็นวิธีการจัดเก็บที่มีประสิทธิภาพ เนื่องจากไม่เกิดปัญหาการจองข้อมูลมากหรือน้อยเกินไป โดยข้อมูลแต่ละ node ของ tree จะประกอบไปด้วย data – เก็บข้อมูลในแต่ละ node Lptr – เก็บ address ของ node ลูกทางด้านซ้ายมือ Rptr – เก็บ address ของ node ลูกทางด้านขวามือ
ตัวอย่าง