Presentation is loading. Please wait.

Presentation is loading. Please wait.

資料結構實習-十 Binary Tree Traversal.

Similar presentations


Presentation on theme: "資料結構實習-十 Binary Tree Traversal."— Presentation transcript:

1 資料結構實習-十 Binary Tree Traversal

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

3 Tree Traversal Inorder Preorder Postorder A / B * C * D + E
A B / C * E * D + + * E D C / B A 18 19 15 16 12 13 6 7 9 10 = NULL

4 二元樹的Inorder traversal– Pseudo Code
void inorder (tree_pointer ptr) { /* inorder tree traversal */ if (ptr) { inorder (ptrleft_child); printf (“%d”, ptrdata); inorder (ptrright_child); } }

5 二元樹的Preorder / Postorder traversals– Pseudo Code
void preorder (tree_pointer ptr) { /* preorder tree traversal */ if (ptr) { printf (“%d”, ptrdata); preorder (ptrleft_child); preorder (ptrright_child); } } void postorder (tree_pointer ptr) { /* postorder tree traversal */ if (ptr) { postorder(ptrleft_child); postorder(ptrright_child); printf (“%d”,ptrdata); } }

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

7 An example for level-order Traversal
+ * E D C / B A Level-order traversal: + * E * D / C A B

8 二元樹的Level-order traversal
void level_order (tree_pointer ptr) { /* level order tree traversal */ int front = near = 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leftChild) addq(ptrleft_child); if (ptrrightChild) addq(ptrright_child); } else break; } }

9 練習 請實做出二元樹(binary tree)的Abstract Data Type。
              練習          請實做出二元樹(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)

10               練習—輸入格式          (-,(/,(*,16,(+,24,13)),9),10) - / 10 * 9 16 + 24 13

11 3-tuple轉二元樹:演算法 (-,(/,(*,16,(+,24,13)),9),10)
              3-tuple轉二元樹:演算法          (-,(/,(*,16,(+,24,13)),9),10) (-,(/,(*,16,(+,24,13)),9),10) - (/,(*,16,(+,24,13)),9) / 10 (*,16,(+,24,13)) * 9 16 (+,24,13) + 24 13

12 3-tuple轉二元樹:演算法 ( 根, 左邊子樹, 右邊子樹) 每一組tuple之間用逗號隔開。 第一個項目(根)一定是運算符號。
              3-tuple轉二元樹:演算法          ( 根, 左邊子樹, 右邊子樹) 每一組tuple之間用逗號隔開。 第一個項目(根)一定是運算符號。 第二 / 三項可能是數字或是算式。 數字即為leaf node。 算式則要進一步使用遞迴展開。 如何判斷是哪一個逗點分隔? 提示:括號必定成對。 (-,(/,(*,16,(+,24,13)),9),10)

13 3-tuple轉二元樹:Pseudo Code
              3-tuple轉二元樹:Pseudo Code          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;

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


Download ppt "資料結構實習-十 Binary Tree Traversal."

Similar presentations


Ads by Google