730 likes | 1.08k Views
โครงสร้างข้อมูลทรีและไบนารีทรี (Tree and Binary Tree). A. B. C. Terminology. ต้นไม้ (Tree) ประกอบด้วย 1. Node ใช้เก็บข้อมูล 2. Branch ใช้เชื่อม Node เข้าด้วยกัน. Node A, B, C Branch AB, AC. A. B. C. Degree หมายถึง จำนวน Branch ที่สัมพันธ์กับ Node แบ่งเป็น
E N D
โครงสร้างข้อมูลทรีและไบนารีทรี(Tree and Binary Tree)
A B C Terminology • ต้นไม้ (Tree) ประกอบด้วย 1. Nodeใช้เก็บข้อมูล 2. Branch ใช้เชื่อม Node เข้าด้วยกัน Node A, B, C Branch AB, AC
A B C • Degreeหมายถึง จำนวน Branch ที่สัมพันธ์กับ Node แบ่งเป็น 1. Indegreeหมายถึง Branchที่เข้าหา Node 2. Outdegree หมายถึง Branchที่ออกจาก Node Node A มี Degree เท่ากับ 2 Indegree = 0 Outdegree = 2
Root A B C • Root หมายถึง Node แรกของ Tree
ดังนั้นจะพบว่าต้นไม้ทั่วไปดังนั้นจะพบว่าต้นไม้ทั่วไป Root มี Indegree = อื่นๆ มี Indegree = Root มี Outdegree = อื่นๆ มี Outdegree = 0 N 1 N
A B C • Leaf หรือ External nodeหมายถึง Node ที่มี Outdegree เท่ากับ 0 Leaf B, C
A B C D E • Internal nodeหมายถึง Node ที่ไม่ใช่ Root และ Leaf Root A Leaf D, E, C Internal node B
A B C D E • Parentหมายถึง Node ที่มี Outdegree Parent A, B
A B C D E • Childหมายถึง Node ที่มี Indegree Child B, C, D, E
A B C D E • Siblingหมายถึง Node ที่มี Parent เดียวกัน Sibling {B, C}, {D, E}
A B C D E • Pathหมายถึง เส้นทางจาก Node หนึ่งไปยังอีก Node หนึ่ง Path จาก A ไป E A -> B -> E ** ทุก Node ใน Tree จะต้องมี Path เดียวเท่านั้น **
A B C D E • Ancestor หมายถึง ทุก Node ในเส้นทางจาก Root ไปยัง Node ที่ต้องการ Ancestor ของ E A, B
A B C D E • Descendentหมายถึง ทุก Node ในเส้นทางจาก Node ที่กำหนดไปจนถึง Leaf Descendent ของ A B, C, D, E Descendent ของ B D,E
Level 0 A Level 1 B C Level 2 D E • Levelหมายถึง ระยะทางจาก Root
Level 0 A Level 1 B C Level 2 D E • Height ของ Treeหมายถึง Level สูงสุด ของ Leaf บวกด้วย 1 Height = 2 + 1 = 3
Depth ของ Nodeหมายถึง ความยาวของ pathจาก root node ถึง node นั้น ดังนั้น root node จึงมีความลึก (Depth) เป็น 0 • Depth ของ Treeหมายถึง ความลึกของ leaf node ที่อยู่ลึกที่สุด ซึ่งจะมีค่าเท่ากับความสูงของ treeเสมอ
Parents Children Siblings Leaves Internal nodes Ancestor of G Descendent of A Height A,B,F B,E,F,C,D,G,H,I {B,E,F}, {C,D}, {G,H,I} C,D,E,G,H,I B,F A,F B,E,F,C,D,G,H,I 3
Subtreeหมายถึง โครงสร้างที่เชื่อมต่อกันภายใต้ Root โดย • Node แรกของ Subtreeจะเป็น Root ของ Subtree นั้น และใช้เป็นชื่อเรียก Subtree • Subtree สามารถแบ่งย่อยเป็น Subtree ได้อีกจนกว่าจะ Empty
แบบฝึกหัด 1. จากต้นไม้ต่อไปนี้ จงหา 1.1 Root 1.2 Leaves 1.3 Internal nodes 1.4 Ancestors of H 1.5 Descendents of F
2.จากต้นไม้ต่อไปนี้ จงหา 2.1 Indegree of node F 2.2 Outdegree of node G 2.3 Siblings of I 2.4 Parent of G 2.5 Children of C
3. จากต้นไม้ต่อไปนี้ จงหา 3.1 Height of the tree 3.2 Height of subtree G 3.3 Level of node I 3.4 Level of node A 3.5 Height of subtree E
Binary Tree หมายถึง ต้นไม้ที่แต่ละ Node มี Subtree <= 2 หรือ Outdegree <= 2
Empty หรือ Null Tree
Hmax = N Hmin = log2N + 1 Height of Binary Tree คำถามที่ 1 มี Node อยู่ทั้งหมด 7 Nodes 1.1 จะสร้าง Tree ให้มี Height สูงสุดได้เท่าไร อย่างไร 1.2 จะสร้าง Tree ให้มี Height ต่ำสุดได้เท่าไร อย่างไร จำนวนเต็มที่มากที่สุดที่น้อยกว่าหรือเท่ากับ log2N
คำถามที่ 2 Tree ที่มี Height = 3 2.1 จะมี Node สูงสุดได้เท่าไร อย่างไร 2.2 จะมี Node ต่ำสุดได้เท่าไร อย่างไร Nmax = 2H - 1 Nmin = H
Complete Binary Tree Binary Tree ที่มี Node เต็มทุก Level Nearly Complete Binary Tree Binary Tree ที่มี Node เต็มทุก Level ยกเว้น Level สุดท้าย และ Node ใน Level สุดท้ายอยู่เรียงกันทางซ้ายมือ
L A B C D E R S F G [0] [1] [2] [3] [4] [5] [6] [7] [8] [9] This association suggests that a complete binary tree can be implemented with an array:
L A B C D E R S F G [0] [1] [2] [3] [4] [5] [6] [7] [8] [9]
L A B C D E R S F G [0] [1] [2] [3] [4] [5] [6] [7] [8] [9]
L A B C D E R S F G [0] [1] [2] [3] [4] [5] [6] [7] [8] [9]
Binary Tree Traversal 1. Depth-firstDescendent ทั้งหมดของ Child จะต้องถูกประมวลผลก่อน Child ถัดไป 2. Breath-firstประมวลผลทีละ Level จากบนลงล่าง
1. Depth-first N L R L N R L R N
แบบ Preorder N L R algorithm preOrder (val root <node pointer>) 1 if (root is not null) 1 process(root) 2 preOrder(root->leftSubtree) 3 preOrder(root->rightSubtree) 2 return
แบบ Inorder L N R algorithm inOrder (val root <node pointer>) 1 if (root is not null) 1 inOrder(root->leftSubtree) 2 process(root) 3 inOrder(root->rightSubtree) 2 return
แบบ Postorder L R N algorithm postOrder (val root <node pointer>) 1 if (root is not null) 1 postOrder(root->leftSubtree) 2 postOrder(root->rightSubtree) 3 process(root) 2 return
2. Breath-first algorithm breathFirst (val root <node pointer>) 1 p = root 2 while (p not null) 1 process(p) 2 if (p->left not null) 1 enqueue(p->left) 3 if (p->right not null) 1 enqueue(p->right) 4 if (not emptyQueue) 1 dequeue(p) else 1 p = null 3 return
A B C D E R S F G L แบบฝึกหัด 1. จากต้นไม้ต่อไปนี้ จงหาลำดับการประมวลผลแบบ Depth-first ทั้งหมด
A B C D E R S F G L 2. จากต้นไม้ต่อไปนี้ จงหาลำดับการประมวลผลแบบ Breath-first
Binary Tree Application 1. Expression Tree 2. Huffman Code
1. Expression Tree หมายถึง Binary Tree ที่มีคุณสมบัติดังต่อไปนี้ 1.Leafเก็บOperand 2. Root และ Internal node เก็บOperator 3. Subtree เป็นSub expression
Prefix Expression Postfix Expression Infix Expression การท่องใน Expression Tree 1. Preorder Traversal 2. Postorder Traversal 3. Inorder Traversal
1. Preorder Traversal 1 if (root is not null) 1 print(root->token) 2 prefix(root->leftSubtree) 3 prefix(root->rightSubtree) 2 return + * a + b c d
2. Postorder Traversal 1 if (root is not null) 1 postfix(root->leftSubtree) 2 postfix(root->rightSubtree) 3 print(root->token) 2 return a b c + * d +
3. Inorder Traversal 1 if (root is not null) 1 if root->token is operand 1 print(root->token) else 1 print(open parenthesis) 2 infix(root->leftSubtree) 3 print(root->token) 4 infix(root->rightSubtree) 5 print(close parenthesis) 2 return ( ( a * ( b + c ) ) + d )
การสร้าง Expression Tree จาก Postfix Expression พิจารณาทีละ Token จนหมด • ถ้า Token เป็น Operand สร้าง Node แล้ว Push ลง Stack • ถ้า Token เป็น Operator Pop ขึ้นมา 2 ตัวเชื่อมเป็น Tree โดยใช้ Operator แล้ว Push ลง Stack
ตัวอย่าง จากนิพจน์ Postfix a b c + * d + จะได้ Expression Tree ดังนี้