資料結構使用 Java

21
資資資資資資 Java 第 10 第 第第第第第 (Binary Search Tree) 1

description

資料結構使用 Java. 第 10 章 二元搜尋樹 (Binary Search Tree). 課程內容. 二元樹追蹤 前序追蹤 中序追蹤 後序追蹤 二元搜尋樹 建立二元搜尋樹的方法 程式碼撰寫實作 刪除二元搜尋樹. 二元樹的追蹤. 二元樹追蹤 (binary tree traversal) 是樹最重要的基本運算。 追蹤時保存著 3 項重要的資訊: 節點資料 指向左子樹的鏈結 指向右子樹的鏈結。. 二元樹的追蹤. 前序 (Preorder) : 樹根→左子樹→右子樹 (DLR) 中序 ( Inorder ) : - PowerPoint PPT Presentation

Transcript of 資料結構使用 Java

Page 1: 資料結構使用 Java

資料結構使用 Java第 10 章 二元搜尋樹(Binary Search Tree)

1

Page 2: 資料結構使用 Java

課程內容•二元樹追蹤

▫前序追蹤▫中序追蹤▫後序追蹤

•二元搜尋樹▫建立二元搜尋樹的方法▫程式碼撰寫實作▫刪除二元搜尋樹

2

Page 3: 資料結構使用 Java

二元樹的追蹤•二元樹追蹤 (binary tree traversal) 是樹最重要的基本運算。•追蹤時保存著 3 項重要的資訊:

▫節點資料▫指向左子樹的鏈結▫指向右子樹的鏈結。

3

Page 4: 資料結構使用 Java

二元樹的追蹤•前序 (Preorder) :

▫樹根→左子樹→右子樹 (DLR) •中序 (Inorder) :

▫左子樹→樹根→右子樹 (LDR)•後序 (Postorder) :

▫左子樹→右子樹→樹根 (LRD)

4

Page 5: 資料結構使用 Java

前序追蹤 (Preorder traversal)•追蹤順序:

1. 節點資料2. 拜訪左子樹3. 拜訪右子樹

5

Page 6: 資料結構使用 Java

6

【範例一】•試寫出下圖之前序追蹤順序。

B

C

E F

I

D

G

J

H

A

LK

Page 7: 資料結構使用 Java

前序追蹤 ( 遞迴演算法 )•若樹根節點不為空節點,則執行下列步驟:1 . 走訪樹根2 . 走訪左子樹 ( 遞迴 ) 3 . 走訪右子樹 ( 遞迴 )•下載原程式碼

7

public void preOrder(){System.out.print(data+" ");if(left!=null)

left.preOrder();if(right!=null)

right.preOrder();}

Page 8: 資料結構使用 Java

中序追蹤 (Inorder traversal)•追蹤順序:

1. 拜訪左子樹2. 節點資料3. 拜訪右子樹

8

Page 9: 資料結構使用 Java

9

【範例二】•試寫出下圖之中序追蹤順序。

B

C

E F

I

D

G

J

H

A

LK

Page 10: 資料結構使用 Java

中序追蹤 ( 遞迴演算法 )•若樹根節點不為空節點,則執行下列步驟:1 . 走訪左子樹 ( 遞迴 ) 2 . 走訪樹根3 . 走訪右子樹 ( 遞迴 )

10

public void inOrder(){if(left!=null)

left.preOrder(); System.out.print(data+" ");if(right!=null)

right.preOrder();}

Page 11: 資料結構使用 Java

後序追蹤 (Postorder traversal)•追蹤順序:

1. 拜訪左子樹2. 拜訪右子樹3. 節點資料

11

Page 12: 資料結構使用 Java

12

【範例三】•試寫出下圖之後序追蹤順序。

B

C

E F

I

D

G

J

H

A

LK

Page 13: 資料結構使用 Java

後序追蹤 ( 遞迴演算法 )•若樹根節點不為空節點,則執行下列步驟:1 . 走訪左子樹 ( 遞迴 ) 2 . 走訪右子樹 ( 遞迴 )3 . 走訪樹根

13

public void postOrder(){if(left!=null)

left.preOrder();if(right!=null)

right.preOrder(); System.out.print(data+" ");

}

Page 14: 資料結構使用 Java

二元搜尋樹Binary Search Tree

14

Page 15: 資料結構使用 Java

二元搜尋樹 (Binary Search Tree)•為一種「有大小順序」的二元樹。•任何節點

▫左子樹之值小於節點的值▫右子樹之值大於節點的值▫左子樹和右子樹亦是二元搜尋樹。

•將二元搜尋樹中序追蹤,即可得到排序後由小至大的資料。

15

50

30 72

42 95

Page 16: 資料結構使用 Java

建立二元搜尋樹•建立二元搜尋樹時,必須加入大小排序規則:

▫以第一個資料當作樹根▫之後之資料與樹根比較

若小於樹根則成為樹根之左子樹 若大於樹根則成為樹根之右子樹 如此一直遞迴之進行。

16

Page 17: 資料結構使用 Java

建立二元搜尋樹•輸入資料: 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

Page 18: 資料結構使用 Java

建立二元搜尋樹 - 程式碼•使用者輸入的第一個數字成為樹根節點 (root) 。

treeNode root = new treeNode(sc.nextInt());•建立 insert 方法來新增節點。

▫呼叫 insert 時傳入新節點 (newNode) 參數。root.insert(new treeNode(sc.nextInt()));

• insert 方法判斷目前節點與新節點的 data 大小▫新節點 data 較小:新增到左子樹。▫新節點 data 較大:新增到右子樹。▫若左、右子樹為空,則直接將新節點掛上。

18

Page 19: 資料結構使用 Java

建立二元搜尋樹 - 程式碼if(newNode.data < data){ // 新節點 data 較小

if(left == null) // 左子樹為空left = newNode;

elseleft.insert(newNode); // 新增到左子樹

}else{if(right == null)

right = newNode;else

right.insert(newNode);}

19

Page 20: 資料結構使用 Java

刪除二元搜尋樹節點•若是樹葉節點:直接刪除•若是內部節點:

▫在左子樹找數值最大的節點取代之▫或是在右子樹找數值最小的節點取代之

•例:刪除右圖 50

20

50

40 65

4530 60

Page 21: 資料結構使用 Java

刪除二元搜尋樹節點•取右子樹最小的節點 •或是取左子樹最大的節點

21

60

40 65

4530

45

40 65

6030