17
Data Structures 實實實實 Instructor: Ching-Chi Lin 實實實 實實實實 [email protected] Department of Computer Science and Engineering National Taiwan Ocean University

Data Structures 實習十二 樹

  • Upload
    cedric

  • View
    70

  • Download
    0

Embed Size (px)

DESCRIPTION

Data Structures 實習十二 樹. Department of Computer Science and Engineering National Taiwan Ocean University. Instructor: Ching-Chi Lin 林清池 助理教授 [email protected]. Tree Traversal. 從 root 開始,使用某種 特定的 順序,走過這棵樹所有的節點。 In-order :先走左邊的子樹,再自己,再走右邊的子樹。 Pre-order :先自己,再走左邊的子樹,再走右邊的子樹。 - PowerPoint PPT Presentation

Citation preview

Page 1: Data Structures 實習十二                樹

Data Structures實習十二 樹

Instructor: Ching-Chi Lin林清池 助理教授

[email protected]

Department of Computer Science and EngineeringNational Taiwan Ocean University

Page 2: Data Structures 實習十二                樹

Tree Traversal

2

從 root 開始,使用某種特定的順序,走過這棵樹所有的節點。 In-order :先走左邊的子樹,再自己,再走右邊的子樹。 Pre-order :先自己,再走左邊的子樹,再走右邊的子樹。 Post-order :先走左邊的子樹,再走右邊的子樹,再自己。 Level-order :同樣高度的先走,從左到右。

Page 3: Data Structures 實習十二                樹

Tree Traversal

3

Inorder A / B * C * D + E

Preorder + * * / A B C D E

Postorder A B / C * D * E +

+

E*

* D

/ C

A B

= NULL

Page 4: Data Structures 實習十二                樹

二元樹 Inorder traversal– PseudoCode

4

void inorder (tree_pointer ptr)

  { /* inorder tree traversal */

   if (ptr) {

    inorder (ptrleft_child);

    printf (“%d”, ptrdata);

    inorder (ptrright_child);

   }

  }

Page 5: Data Structures 實習十二                樹

二元樹 Preorder traversal-PseudoCode

5

void preorder (tree_pointer ptr)           

  { /* preorder tree traversal */

   if (ptr) {

    printf (“%d”, ptrdata);

    preorder (ptrleft_child);

    preorder (ptrright_child);

   }

  }

Page 6: Data Structures 實習十二                樹

二元樹 Postorder traversal-PseudoCode

6

void postorder (tree_pointer ptr)           

  { /* postorder tree traversal */

   if (ptr) {

    postorder (ptrleft_child);

    postorder (ptrright_child);

    printf (“%d”, ptrdata);

   }

  }

Page 7: Data Structures 實習十二                樹

Level-Order traversal

7

首先拜訪根節點。 然後是根節點的左子節點,接著根節點的右子節點。 以相同的方式拜訪下一階層中的節點,由最左邊的節點到最右邊的節點。

Page 8: Data Structures 實習十二                樹

Level-Order traversal

8

B

+

A

/

*

*

C

D

E

Level-Order traversal :+*E*D/CAB

Page 9: Data Structures 實習十二                樹

Level-Order traversal-PseudoCode

9

void level_order (tree_pointer ptr)           

  { /* level order tree traversal */

   int front = rear = 0;

   tree_pointer queue [MAX_QUEUE_SIZE];

   if (!ptr) return; /*empty tree*/     addq(ptr);

   for ( ; ; ) {

    ptr = deleteq();

    if (ptr) {

     printf(“%d”,ptr->data);

     if (ptr->left_child) addq(ptr->left_child);

     if (ptr->right_child) addq(ptr->right_child);

    }else break;

   }

  }

Page 10: Data Structures 實習十二                樹

練習

10

請實做出二元樹( binary tree )的 Abstract Data Type 。 非 leaf node 為算符。 leaf node 為數字。

從檔案讀入一個三元組( 3-tuple )式子,並轉成二元樹型態。 檔案為純文字檔,請從教學網站下載。

請實做出對二元樹進行 In-order /Pre-order/Post-order/Level-order 的函式。

輸入格式: ( 根 , 左邊子樹 , 右邊子樹 ) Ex:(-,(/,(*,16,(+,24,13)),9),10)

Page 11: Data Structures 實習十二                樹

練習—輸入格式

11

(-,(/,(*,16,(+,24,13)),9),10)

-

/

*

+16

10

9

24 13

Page 12: Data Structures 實習十二                樹

3-tuple 轉二元樹:演算法

12

(-,(/,(*,16,(+,24,13)),9),10) (-,(/,(*,16,(+,24,13)),9),10) -

(/,(*,16,(+,24,13)),9)

9

10/

(*,16,(+,24,13)) *

16(+,24,13) +

24 13

Page 13: Data Structures 實習十二                樹

3-tuple 轉二元樹:演算法

13

( 根 , 左邊子樹 , 右邊子樹 )

每一組 tuple 之間用逗號隔開。 第一個項目(根)一定是運算符號。 第二 / 三項可能是數字或是算式。

數字即為 leaf node 。 算式則要進一步使用遞迴展開。

如何判斷是哪一個逗點分隔? 提示:括號必定成對。

(-,(/,(*,16,(+,24,13)),9),10)

Page 14: Data Structures 實習十二                樹

int atoi (const char * str);

14

#include<stdlib.h> 輸入一個字串。 如果該字串是數字,傳回一整數。 Ex : int a = atoi("100")

Page 15: Data Structures 實習十二                樹

3-tuple 轉二元樹: PseudoCode 1/1

15

node* build_tree_from_string (char* formula)

  {

   char left[1024],right[1024],op;

   root = get_node();

   if (formula is a number){

    root->value = atoi(formula);

    root->left = NULL;

    root->right = NULL;

   }else{

    <Separate formula into operator, left_subtree, right_subtree>;

    root->operator= operator;

    root->left=build_tree_from_string(left);

    root->right=build_tree_from_string(right);

   } return root;

  }

Page 16: Data Structures 實習十二                樹
Page 17: Data Structures 實習十二                樹