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
Data Structures實習十二 樹
Instructor: Ching-Chi Lin林清池 助理教授
Department of Computer Science and EngineeringNational Taiwan Ocean University
Tree Traversal
2
從 root 開始,使用某種特定的順序,走過這棵樹所有的節點。 In-order :先走左邊的子樹,再自己,再走右邊的子樹。 Pre-order :先自己,再走左邊的子樹,再走右邊的子樹。 Post-order :先走左邊的子樹,再走右邊的子樹,再自己。 Level-order :同樣高度的先走,從左到右。
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
二元樹 Inorder traversal– PseudoCode
4
void inorder (tree_pointer ptr)
{ /* inorder tree traversal */
if (ptr) {
inorder (ptrleft_child);
printf (“%d”, ptrdata);
inorder (ptrright_child);
}
}
二元樹 Preorder traversal-PseudoCode
5
void preorder (tree_pointer ptr)
{ /* preorder tree traversal */
if (ptr) {
printf (“%d”, ptrdata);
preorder (ptrleft_child);
preorder (ptrright_child);
}
}
二元樹 Postorder traversal-PseudoCode
6
void postorder (tree_pointer ptr)
{ /* postorder tree traversal */
if (ptr) {
postorder (ptrleft_child);
postorder (ptrright_child);
printf (“%d”, ptrdata);
}
}
Level-Order traversal
7
首先拜訪根節點。 然後是根節點的左子節點,接著根節點的右子節點。 以相同的方式拜訪下一階層中的節點,由最左邊的節點到最右邊的節點。
Level-Order traversal
8
B
+
A
/
*
*
C
D
E
Level-Order traversal :+*E*D/CAB
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;
}
}
練習
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)
練習—輸入格式
11
(-,(/,(*,16,(+,24,13)),9),10)
-
/
*
+16
10
9
24 13
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
3-tuple 轉二元樹:演算法
13
( 根 , 左邊子樹 , 右邊子樹 )
每一組 tuple 之間用逗號隔開。 第一個項目(根)一定是運算符號。 第二 / 三項可能是數字或是算式。
數字即為 leaf node 。 算式則要進一步使用遞迴展開。
如何判斷是哪一個逗點分隔? 提示:括號必定成對。
(-,(/,(*,16,(+,24,13)),9),10)
int atoi (const char * str);
14
#include<stdlib.h> 輸入一個字串。 如果該字串是數字,傳回一整數。 Ex : int a = atoi("100")
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;
}