資料結構使用 Java
-
Upload
xander-finley -
Category
Documents
-
view
77 -
download
11
description
Transcript of 資料結構使用 Java
資料結構使用 Java第 10 章 二元搜尋樹(Binary Search Tree)
1
課程內容•二元樹追蹤
▫前序追蹤▫中序追蹤▫後序追蹤
•二元搜尋樹▫建立二元搜尋樹的方法▫程式碼撰寫實作▫刪除二元搜尋樹
2
二元樹的追蹤•二元樹追蹤 (binary tree traversal) 是樹最重要的基本運算。•追蹤時保存著 3 項重要的資訊:
▫節點資料▫指向左子樹的鏈結▫指向右子樹的鏈結。
3
二元樹的追蹤•前序 (Preorder) :
▫樹根→左子樹→右子樹 (DLR) •中序 (Inorder) :
▫左子樹→樹根→右子樹 (LDR)•後序 (Postorder) :
▫左子樹→右子樹→樹根 (LRD)
4
前序追蹤 (Preorder traversal)•追蹤順序:
1. 節點資料2. 拜訪左子樹3. 拜訪右子樹
5
6
【範例一】•試寫出下圖之前序追蹤順序。
B
C
E F
I
D
G
J
H
A
LK
前序追蹤 ( 遞迴演算法 )•若樹根節點不為空節點,則執行下列步驟:1 . 走訪樹根2 . 走訪左子樹 ( 遞迴 ) 3 . 走訪右子樹 ( 遞迴 )•下載原程式碼
7
public void preOrder(){System.out.print(data+" ");if(left!=null)
left.preOrder();if(right!=null)
right.preOrder();}
中序追蹤 (Inorder traversal)•追蹤順序:
1. 拜訪左子樹2. 節點資料3. 拜訪右子樹
8
9
【範例二】•試寫出下圖之中序追蹤順序。
B
C
E F
I
D
G
J
H
A
LK
中序追蹤 ( 遞迴演算法 )•若樹根節點不為空節點,則執行下列步驟:1 . 走訪左子樹 ( 遞迴 ) 2 . 走訪樹根3 . 走訪右子樹 ( 遞迴 )
10
public void inOrder(){if(left!=null)
left.preOrder(); System.out.print(data+" ");if(right!=null)
right.preOrder();}
後序追蹤 (Postorder traversal)•追蹤順序:
1. 拜訪左子樹2. 拜訪右子樹3. 節點資料
11
12
【範例三】•試寫出下圖之後序追蹤順序。
B
C
E F
I
D
G
J
H
A
LK
後序追蹤 ( 遞迴演算法 )•若樹根節點不為空節點,則執行下列步驟:1 . 走訪左子樹 ( 遞迴 ) 2 . 走訪右子樹 ( 遞迴 )3 . 走訪樹根
13
public void postOrder(){if(left!=null)
left.preOrder();if(right!=null)
right.preOrder(); System.out.print(data+" ");
}
二元搜尋樹Binary Search Tree
14
二元搜尋樹 (Binary Search Tree)•為一種「有大小順序」的二元樹。•任何節點
▫左子樹之值小於節點的值▫右子樹之值大於節點的值▫左子樹和右子樹亦是二元搜尋樹。
•將二元搜尋樹中序追蹤,即可得到排序後由小至大的資料。
15
50
30 72
42 95
建立二元搜尋樹•建立二元搜尋樹時,必須加入大小排序規則:
▫以第一個資料當作樹根▫之後之資料與樹根比較
若小於樹根則成為樹根之左子樹 若大於樹根則成為樹根之右子樹 如此一直遞迴之進行。
16
建立二元搜尋樹•輸入資料: 37, 57, 23, 15, 32 。
17
37
57 23
37
57 23
37
57
37
37
57 23
57 23
15 32
15 15 32
建立二元搜尋樹 - 程式碼•使用者輸入的第一個數字成為樹根節點 (root) 。
treeNode root = new treeNode(sc.nextInt());•建立 insert 方法來新增節點。
▫呼叫 insert 時傳入新節點 (newNode) 參數。root.insert(new treeNode(sc.nextInt()));
• insert 方法判斷目前節點與新節點的 data 大小▫新節點 data 較小:新增到左子樹。▫新節點 data 較大:新增到右子樹。▫若左、右子樹為空,則直接將新節點掛上。
18
建立二元搜尋樹 - 程式碼if(newNode.data < data){ // 新節點 data 較小
if(left == null) // 左子樹為空left = newNode;
elseleft.insert(newNode); // 新增到左子樹
}else{if(right == null)
right = newNode;else
right.insert(newNode);}
19
刪除二元搜尋樹節點•若是樹葉節點:直接刪除•若是內部節點:
▫在左子樹找數值最大的節點取代之▫或是在右子樹找數值最小的節點取代之
•例:刪除右圖 50
20
50
40 65
4530 60
刪除二元搜尋樹節點•取右子樹最小的節點 •或是取左子樹最大的節點
21
60
40 65
4530
45
40 65
6030