1. Trang chủ
  2. » Giáo án - Bài giảng

Chương 7 Cây (Tree)

123 757 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 123
Dung lượng 5,31 MB

Nội dung

Nội dung2  Cấu trúc cây Tree  Cấu trúc cây nhị phân Binary Tree  Cấu trúc cây nhị phân tìm kiếm Binary Search Tree  Cấu trúc cây nhị phân tìm kiếm cân bằng AVL Tree... Nội dung17 

Trang 1

Chương 7: CÂY (Tree)

Trang 2

Nội dung

2

Cấu trúc cây (Tree)

Cấu trúc cây nhị phân (Binary Tree)

Cấu trúc cây nhị phân tìm kiếm (Binary Search Tree)

Cấu trúc cây nhị phân tìm kiếm cân bằng

(AVL Tree)

Trang 3

Tree – Định nghĩa

3

Cây là một tập gồm 1 hay nhiều nút T, trong đó

có một nút đặc biệt được gọi là gốc , các nút còn lại được chia thành những tập rời nhau T1,

T2 , , Tn theo quan hệ phân cấp trong đó Ticũng là một cây

A tree is a set of one or more nodes T such that:

i there is a specially designated node called a root

ii The remaining nodes are partitioned into n

disjointed set of nodes T1, T2,…,Tn, each of which is

a tree

Trang 4

Nội địa Quốc tế

Châu âu Mỹ Các nước

Trang 5

Tree – Ví dụ

Cây thư mục

5

Trang 6

Tree – Ví dụ

Trang 8

Tree - Một số khái niệm cơ bản

Bậc của một nút (Degree of a Node of a Tree):

Là số cây con của nút đó Nếu bậc của một nút bằng 0 thì nút đó gọi là nút lá (leaf node)

Bậc của một cây (Degree of a Tree):

Là bậc lớn nhất của các nút trong cây Cây

có bậc n thì gọi là cây n-phân

Trang 9

Tree - Một số khái niệm cơ bản

10

Nút nhánh:

Là nút có bậc khác 0 và không phải là gốc

Mức của một nút (Level of a Node):

Trang 11

Trắc nghiệm

The depth of a tree is the _ of a tree

a) number of nodes on the tree b) number of levels of a tree c) number of branches

12

Trang 12

Nội dung

17

Cấu trúc cây (Tree)

Cấu trúc cây nhị phân (Binary Tree)

Cấu trúc cây nhị phân tìm kiếm (Binary Search Tree)

Cấu trúc cây nhị phân tìm kiếm cân bằng

(AVL Tree)

Trang 13

Binary Tree – Định nghĩa

18

Cây nhị phân là cây mà mỗi nút có tối đa

2 cây con (cây có bậc là 2)

Trang 14

Binary Tree – Ví dụ

19

Cây con trái

Cây con phải

Hình ảnh môôt cây nhị phân

Trang 15

Binary Tree – Ví dụ

Cây lệch trái và cây lệch phải

Trang 16

Binary Tree – Ví dụ

Cây nhị phân đầy đủ ( A full binary tree )

Trang 17

Binary Tree – Ứng dụng

Cây biểu thức: được dùng để biểu diễn một biểu thức toán học

22

Trang 18

Binary Tree – Ví dụ

Cây quyết định: được dùng để hỗ trợ quá trình ra quyết định

23

Trang 19

Binary Tree – Một số tính chất

Số nút nằm ở mức i ≤ 2 i

Số nút lá ≤ 2 h-1 , với h là chiều cao của cây

Số nút trong cây ≤ 2 h -1, với h là chiều cao của cây

Chiều cao của cây ≥ log 2 N, với N là số nút trong cây

24

Trang 20

Trắc nghiệm

A binary tree is a tree in which each node

references at most _ node(s)

If the depth of a binary tree is 3, then what

is the maximum size of the tree?

25

Trang 21

Binary Tree - Biểu diễn

In general, any

binary tree can be represented using

an array, but it leads to the waste of storage …

Trang 22

Binary Tree - Biểu diễn27

Trang 23

Binary Tree - Biểu diễn28

Trang 24

Binary Tree - Biểu diễn

29

Sử dụng cấu trúc để lưu trữ các thông tin của một nút gồm:

Dữ liệu của nút

Địa chỉ nút gốc của cây con trái

Địa chỉ nút gốc của cây con phải

Khai báo cấu trúc cây nhị phân:

Để quản lý cây nhị phân chỉ cần quản lý địa chỉ nút gốc:

Tree root;

struct TNode {

Trang 25

Binary Tree – Khởi tạo cây

Khởi tạo cây rỗng:

void InitTree ( Tree &t) {

t = NULL ; }

31

Trang 26

Binary Tree - Duyệt cây nhị phân

Trang 27

Binary Tree - Duyệt cây nhị phân

Duyệt theo thứ tự trước NLR (Node-Left-Right)

Kiểu duyệt này trước tiên thăm nút gốc sau

đó thăm các nút của cây con trái rồi đến

cây con phải

Thủ tục duyệt có thể trình bày đơn giản như sau:

33

void NLR ( Tree t) {

if (t != NULL ) {

// Xử lý t tương ứng theo nhu cầu

NLR (t->pLeft);

NLR (t->pRight);

} }

Trang 28

Binary Tree - Duyệt cây nhị phân NLR34

A B

L P

G M

A Kết quả: B D H I N E J O K C F L P G M

Trang 29

Binary Tree - Duyệt cây nhị phân

Duyệt theo thứ tự giữa LNR (Left-Node-Right)

Kiểu duyệt này trước tiên thăm các nút của

cây con trái sau đó thăm nút gốc rồi đến

cây con phải

Thủ tục duyệt có thể trình bày đơn giản như sau:

35

void LNR ( Tree t) {

if (t != NULL ) {

LNR (t->pLeft);

//Xử lý nút t theo nhu cầu

LNR (t->pRight);

} }

Trang 30

Binary Tree - Duyệt cây nhị phân LNR36

A B

L P

G M

H Kết quả: D N I B J O E K A F P L C M G

Trang 31

Binary Tree - Duyệt cây nhị phân

Duyệt theo thứ tự giữa LRN (Left-Right-Node)

Kiểu duyệt này trước tiên thăm các nút của

cây con trái sau đó thăm đến cây con phải

rồi cuối cùng mới thăm nút gốc

Thủ tục duyệt có thể trình bày đơn giản như sau:

37

void LRN ( Tree t) {

if (t != NULL ) {

LRN (t->pLeft);

LRN (t->pRight);

// Xử lý tương ứng t theo nhu cầu

} }

Trang 32

Binary Tree - Duyệt cây nhị phân LRN38

A B

L P

G M

H Kết quả: N I D O J K E B P L F M G C A

Trang 34

Binary Tree – Ứng dụng

Tính toán giá trị của biểu thức dựa trên cây biểu thức: duyệt cây theo thứ tự giữa:

40

Trang 35

Trắc nghiệm

Give the binary tree with root A The

root has left child B and right child C

B has left child D and right child E

There are no other nodes in the tree.

Which of the following traversals yields ABCDE?

a) Inorder

b) Preorder

c) All of the others answers

d) None of the others answers

41

Trang 37

Trắc nghiệm

The order in which the nodes of this tree would be visited by a pre-order traversal is

43

a) GCMBEJQDFKY b) BCDFEJKYQMG c) BCDEFGKJMYQ d) GCBEDFMJKQY

Trang 38

Một cách biểu diễn cây nhị phân khác

44

Đôi khi, khi định nghĩa cây nhị phân, người

ta quan tâm đến cả quan hệ 2 chiều cha con chứ không chỉ một chiều như định nghĩa ở phần trên

Lúc đó, cấu trúc cây nhị phân có thể định nghĩa lại như sau:

Trang 39

Một số thao tác trên cây

Trang 40

Đếm số node

47

Trang 41

Đếm số node

Thuật toán:

Nếu Tree rỗng, Số node (Tree) = 0

Ngược lại, Số node (Tree) = 1 + Số node (Tree.Left) + Số node (Tree.Right)

48

Trang 42

Đếm số node lá

49

Trang 43

Đếm số node lá

Thuật toán:

Nếu Tree rỗng, Số nút lá (Tree) = 0

Nếu Tree là nút lá, Số nút lá (Tree) = 1 +

Trang 44

Tính chiều cao

51

Trang 45

Tính chiều cao

Thuật toán:

Nếu Tree rỗng, Height(Tree) = 0

Ngược lại, Height(Tree) = 1 +

max(Height(Tree.Left),

Height(Tree.Right))

52

Trang 46

Nội dung

53

Cấu trúc cây (Tree)

Cấu trúc cây nhị phân (Binary Tree)

Cấu trúc cây nhị phân tìm kiếm (Binary Search Tree)

Cấu trúc cây nhị phân tìm kiếm cân bằng

(AVL Tree)

Trang 47

Binary Search Tree

Trong chương 6, chúng ta đã làm quen với một số cấu

trúc dữ liệu động Các cấu trúc này có sự mềm dẻo nhưng lại bị hạn chế trong việc tìm kiếm thông tin trên chúng (chỉ có thể tìm kiếm tuần tự)

Nhu cầu tìm kiếm là rất quan trọng Vì lý do này, người

ta đã đưa ra cấu trúc cây để thỏa mãn nhu cầu trên

Tuy nhiên, nếu chỉ với cấu trúc cây nhị phân đã định nghĩa ở trên, việc tìm kiếm còn rất mơ hồ

Cần có thêm một số ràng buộc để cấu trúc cây trở nên chặt chẽ, dễ dùng hơn

Một cấu trúc như vậy chính là cây nhị phân tìm kiếm

Trang 48

Binary Search Tree - Định nghĩa

Cây nhị phân tìm kiếm (CNPTK) là cây nhị phân trong đó tại mỗi nút, khóa của nút đang xét lớn hơn khóa của tất cả các nút thuộc cây con trái và nhỏ hơn khóa của tất cả các nút thuộc cây con phải

Nhờ ràng buộc về khóa trên CNPTK, việc tìm kiếm trở nên

Trang 49

Binary Search Tree – Ví dụ

Trang 50

Binary Search Tree – Ví dụ

Trang 51

Binary Search Tree – Ví dụ

Trang 52

Binary Search Tree – Biểu diễn

59

Cấu trúc dữ liệu của CNPTK là cấu trúc dữ liệu biểu diễn cây nhị phân nói chung

(???)

Thao tác duyệt cây trên CNPTK hoàn toàn

giống như trên cây nhị phân

Chú ý: khi duyệt theo thứ tự giữa, trình tự các nút duyệt qua sẽ cho ta một dãy các nút theo thứ tự tăng dần của khóa

Trang 53

Binary Search Tree – Duyệt cây

60

25 10

35 32

50 41

Duyệt inorder: 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50

Duyệt giữa trên CNPTK

Trang 54

Binary Search Tree – Duyệt cây

61

25 10

35 32

50 41

Duyệt postorder: 1 5 6 3 13 12 20 18 10 32 35 29 41 50 37 25

Duyệt sau trên CNPTK

Trang 55

Binary Search Tree – Duyệt cây

62

25 10

35 32

50 41

Duyệt preorder: 25 10 3 1 6 5 18 12 13 20 37 29 35 32 50 41

Duyệt trước trên CNPTK

Trang 56

Binary Search Tree – Tìm kiếm

63

25 10

35 32

50 41

Tìm kiếm 13

Khác nhau Giống nhau Node gốc nhỏ hơn Node gốc lớn hơn

Tìm thấy Số node duyệt: 5

Tìm kiếm trên CNPTK

Trang 57

Binary Search Tree – Tìm kiếm

64

25 10

35 32

50 41

Tìm kiếm 14

Khác nhau Node gốc nhỏ hơn Node gốc lớn hơn

Không tìm thấy Số node duyệt: 5

Tìm kiếm trên CNPTK

Trang 58

Binary Search Tree – Tìm kiếm

if (T->data ==X)

return T;

if (T->data >X)

return searchNode (T->pLeft, X);

return searchNode (T->pRight, X);

}

return NULL ; }

Trang 59

Binary Search Tree – Tìm kiếm

Trang 60

Binary Search Tree – Tìm kiếm

67

Nhận xét:

Số lần so sánh tối đa phải thực hiện để tìm phần tử X là h, với h là chiều cao của cây

Như vậy thao tác tìm kiếm trên CNPTK có

n nút tốn chi phí trung bình khoảng O(log2n)

Trang 61

Binary Search Tree – Thêm

68

Việc thêm một phần tử X vào cây phải bảo

đảm điều kiện ràng buộc của CNPTK

Ta có thể thêm vào nhiều chỗ khác nhau trên cây, nhưng nếu thêm vào một nút ngoài sẽ là tiện lợi nhất do ta có thể thực hiện quá

trình tương tự thao tác tìm kiếm

Khi chấm dứt quá trình tìm kiếm cũng chính

là lúc tìm được chỗ cần thêm

Cách thực hiện:

Tìm vị trí thêm (???)

Trang 62

Binary Search Tree – Thêm

Thêm một phần tử vào cây:

Trang 63

6

4 1

3

Binary Search Tree – Thêm

Ví dụ tạo cây với dãy:

4, 6, 1, 2, 5, 7, 3

Trang 64

Binary Search Tree – Thêm

65

Ví dụ tạo cây với dãy :

30, 12, 17, 49, 22, 65, 51, 56, 70, 68

Trang 66

Xác định độ sâu/chiều cao của cây

Tìm giá trị nhỏ nhất/lớn nhất trên cây

Tính tổng các giá trị trên cây

Đếm số nút có giá trị bằng x

Xuất các số nguyên tố trên cây

73

Trang 67

Binary Search Tree – Hủy một phần tử có khóa X

Trang 68

Binary Search Tree – Hủy một phần tử có

Trang 69

Binary Search Tree – Hủy một phần tử có khóa X

Trường hợp 2: X chỉ có 1 con (trái hoặc phải)

Trước khi hủy X ta móc nối cha của X với con duy nhất của nó

Trang 70

Binary Search Tree – Hủy một phần tử có

khóa X

Trường hợp 3: X có đủ 2 con :

Không thể hủy trực tiếp do X có đủ 2 con

Hủy gián tiếp:

 Thay vì hủy X, ta sẽ tìm một phần tử thế mạng Y Phần tử này có tối đa một con

 Thông tin lưu tại Y sẽ được chuyển lên lưu tại X

 Sau đó, nút bị hủy thật sự sẽ là Y giống như 2 trường hợp đầu

Vấn đề: chọn Y sao cho khi lưu Y vào vị trí của X, cây vẫn là CNPTK

77

Trang 71

Binary Search Tree – Hủy một phần tử có

khóa X

Cách chọn phần tử thế mạng:

 Phần tử nhỏ nhất (trái nhất) trên cây con phải (của nút muốn xóa)

 Phần tử lớn nhất (phải nhất) trên cây con trái (của nút muốn xóa)

Việc chọn lựa phần tử nào là phần tử thế

mạng phụ thuộc vào ý thích của người lập trình

Ở đây, ta sẽ chọn phần tử nhỏ nhất trên cây con phải làm phần tử thế mạng

78

Trang 72

Binary Search Tree – Hủy một phần tử có khóa X

Trang 73

Binary Search Tree – Hủy một phần tử có khóa X

80

Xóa 51

Trang 74

Binary Search Tree – Hủy một phần tử có khóa X

81

Xóa 83

Trang 75

Binary Search Tree – Hủy một phần tử có khóa X

82

Xóa 36

Trang 76

Binary Search Tree – Hủy một phần tử có khóa X

83

Xóa nút gốc:

Trang 77

Binary Search Tree – Hủy một phần tử có khóa X

84

Xóa nút gốc:

42 là thế mạng

Trang 78

Binary Search Tree – Hủy một phần tử có khóa X

85

Kết quả xóa:

Trang 79

Binary Search Tree – Hủy một phần tử có khóa X

86

Xóa gốc 42

Trang 80

Binary Search Tree – Hủy một phần tử có khóa X

Xóa gốc 42

45 thế mạng

87

Trang 81

Binary Search Tree – Hủy một phần tử có khóa X

88

Kết quả xóa:

Trang 82

Binary Search Tree – Hủy một phần tử có khóa X

Các hàm dùng để hủy 1 phần tử:

Hàm delNode trả về giá trị 1, 0 khi hủy

thành công hoặc không có X trong cây:

int delNode (Tree &T, DataType X)

Hàm searchStandFor tìm phần tử thế mạng q

và gán dữ liệu của q cho nút muốn xóa p

void searchStandFor (Tree &p, Tree &q)

89

Trang 83

if (T->data > X) return delNode (T->pLeft, X);

if (T->data < X) return delNode (T->pRight, X);

TNode * p = T;

if (T->pLeft == NULL ) T = T->pRight;

else if (T->pRight == NULL ) T = T->pLeft;

else // T có đủ 2 con

searchStandFor (p, T->pRight);

delete p;

}

Trang 84

Binary Search Tree – Hủy một phần tử có khóa X

Tìm phần tử thế mạng (nhỏ nhất trên cây con phải):

p->data = q->data;

p = q;

q = q->pRight;

} }

Trang 85

Binary Search Tree – Hủy toàn bộ cây

Việc toàn bộ cây có thể được thực hiện thông qua thao tác duyệt cây theo thứ tự sau Nghĩa là ta sẽ hủy cây con trái, cây con phải rồi mới hủy nút gốc

92

void removeTree ( Tree &T) {

if (T) {

removeTree (T->pLeft);

removeTree (T->pRight);

delete (T);

} }

Trang 86

Binary Search Tree

93

Nhận xét:

Tất cả các thao tác searchNode , insertNode , delNode

đều có độ phức tạp trung bình O(h), với h là chiều cao của cây

Trong trong trường hợp tốt nhất, CNPTK có n nút sẽ

có độ cao h = log 2 (n) Chi phí tìm kiếm khi đó sẽ tương đương tìm kiếm nhị phân trên mảng có thứ tự

Trong trường hợp xấu nhất, cây có thể bị suy biến thành 1 danh sách liên kết (khi mà mỗi nút đều chỉ

có 1 con trừ nút lá) Lúc đó các thao tác trên sẽ

có độ phức tạp O(n)

Vì vậy cần có cải tiến cấu trúc của CNPTK để đạt được chi phí cho các thao tác là log 2 (n)

Trang 87

Nhập x, tìm giá trị nhỏ nhất trên cây mà lớn hơn x

Xuất số nguyên tố nhỏ nhất trên cây

Nhập x, tìm x trên cây, nếu tìm thấy x thì cho biết x có bao nhiêu con

Xóa 1 nút

94

Trang 88

Nội dung

95

Cấu trúc cây (Tree)

Cấu trúc cây nhị phân (Binary Tree)

Cấu trúc cây nhị phân tìm kiếm (Binary Search Tree)

Cấu trúc cây nhị phân tìm kiếm cân bằng

(AVL Tree)

Trang 89

Đánh giá tìm kiếm96

Trang 91

Giới thiệu AVL Tree

Phương pháp chèn trên CNPTK có thể có những biến dạng mất cân đối nghiêm trọng

Chi phí cho việc tìm kiếm trong trường hợp xấu nhất đạt tới n

VD: 1 triệu nút chi phí tìm kiếm = 1.000.000 nút

Nếu có một cây tìm kiếm nhị phân cân bằng hoàn

toàn, chi phí cho việc tìm kiếm chỉ xấp xỉ log2n

VD: 1 triệu nút chi phí tìm kiếm = log 2 1.000.000 ≈

Trang 92

AVL Tree - Định nghĩa

99

Cây nhị phân tìm kiếm cân bằng (AVL) là cây mà tại mỗi nút độ cao của cây con trái và của cây con phải chênh lệch không

Trang 93

AVL Tree – Ví dụ

100

Trang 94

AVL Tree

Chỉ số cân bằng của một nút:

Định nghĩa: Chỉ số cân bằng của một nút là hiệu của chiều cao cây con phải và cây con trái của nó

Đối với một cây cân bằng, chỉ số cân bằng (CSCB) của mỗi nút chỉ có thể mang một

trong ba giá trị sau đây:

 CSCB(p) = 0 ⇔ Độ cao cây phải (p) = Độ cao cây trái (p)

 CSCB(p) = 1 ⇔ Độ cao cây phải (p) > Độ cao cây trái (p)

 CSCB(p) = -1 ⇔ Độ cao cây phải (p) < Độ cao cây trái (p)

101

Trang 95

Ví dụ - Chỉ số cân bằng của nút

•What is the balance factor for each node in this AVL tree?

•Is this an AVL tree?

1 -1

0

0

-1 -1

1 0 0

Trang 96

AVL Tree – Ví dụ103

Trang 97

AVL Tree – Biểu diễn

104

#define RH 1 /* Cây con phải cao hơn */

#define EH 0 /* Hai cây con bằng nhau */

#define LH -1 /* Cây con trái cao hơn

Trang 98

AVL Tree – Biểu diễn

105

Các thao tác đặc trưng của cây AVL:

Thêm một phần tử vào cây AVL

Hủy một phần tử trên cây AVL

Cân bằng lại một cây vừa bị mất cân bằng (Rotation)

Trường hợp thêm một phần tử trên cây AVL được thực

hiện giống như thêm trên CNPTK, tuy nhiên sau khi thêm phải cân bằng lại cây

Trường hợp hủy một phần tử trên cây AVL được thực hiện giống như hủy trên CNPTK và cũng phải cân bằng lại cây

Việc cân bằng lại một cây sẽ phải thực hiện sao cho chỉ ảnh hưởng tối thiểu đến cây nhằm giảm thiểu chi phí cân bằng

Trang 99

AVL Tree - Các trường hợp mất cân bằng

Ta sẽ không khảo sát tính cân bằng của 1 cây nhị phân bất

kỳ mà chỉ quan tâm đến các khả năng mất cân bằng xảy ra khi chèn hoặc xóa một nút trên cây AVL

Trang 100

AVL Tree - Các trường hợp mất cân bằng

Chèn nút vào cây AVL

1 và 4 là các ảnh đối xứng

2 và 3 là các ảnh đối xứng

Ngày đăng: 12/05/2014, 10:29

TỪ KHÓA LIÊN QUAN

w