Tải bản đầy đủ (.pdf) (26 trang)

Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 3: Cây

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (920.67 KB, 26 trang )

8/4/2020

2.2.4 Cài đặt bởi mảng
❖Ưu điểm:
▪ Truy cập nhanh, ngẫu nhiên và như nhau đối với mọi phần tử
nhờ vào chỉ số
▪ Thao tác tìm kiếm dễ dàng

❖Nhược điểm
▪ Kích thước mảng trong mọi ngơn ngữ lập trình đều cố định→
Hạn chế độ dài của danh sách, trong khi danh sách thường
xuyên thêm bớt không cố định độ dài
▪ Việc thêm bớt khó khăn do phải dịch chuyển nhiều phần tử
(thời gian chạy là O(n))

Cấu trúc dữ liệu và giải thuật

79

CHƯƠNG 3: CÂY (9t)
3.1 ĐỊnh nghĩa và khái niệm cơ bản
3.2 Một số phép toán trên cây
3.3 Cài đặt cây
3.4 Cây nhị phân
3.5 Cây tìm kiếm nhị phân
3.6 Cây cân bằng

Chương 3. Cây

80


40


8/4/2020

3.1 Định nghĩa và khái niệm cơ bản
3.1.1 Định nghĩa
3.1.2 Các khái niệm cơ bản về cây

Chương 3. Cây

81

3.1.1 Định nghĩa
Cây: (Tree)
❖ Cây T là một bộ <V, E>, trong
đó:
V: Tập hữu hạn các phần tử (nút)
E: Tập hữu hạn(cung) thể hiện mối
quan hệ phân cấp là quan hệ “
cha – con”.
Kí hiệu: T=<V, E>
❖ Nút gốc (root): là nút không
phải là con của bất cứ nút nào
❖ Cây rỗng (null tree): là cây
khơng có nút nào

Chương 3. Cây

82


41


8/4/2020

3.1.1 Định nghĩa
Các ví dụ về cấu trúc cây
❖Mục lục của một cuốn sách
❖Cấu trúc thư mục trên đĩa máy tính.
❖Sơ đồ nhân sự của tổ chức
❖Cây phả hệ
❖Dùng cây để biểu diễn biểu thức số học, chẳng
hạn: ( a+b) x (c-d/e)

Chương 3. Cây

83

3.1.1 Định nghĩa
x
-

+
/

c
a

b


d

Chương 3. Cây

e

84

42


8/4/2020

3.1.2 Các khái niệm cơ bản về cây
❖Số các con của một nút gọi là cấp/bậc (degree) của nút
đó
▪ Nút có bậc bằng 0 gọi là nút lá (leaf)
▪ Các nút không phải nút lá gọi là nút nhánh ( branch)
▪ Bậc cao nhất có trong các nút của một cây gọi là bậc của cây
đó.

❖Mức-Level: Gốc của cây có mức 1, nếu một nút có mức i
thì các nút con của nút đó có mức i+1.
▪ Chiều cao (height) của cây là số mức lớn nhất của các nút có
trên cây đó

Chương 3. Cây

85


3.1.2 Các khái niệm cơ bản về cây
❖Cây có thứ tự: là cây mà có xét đến thứ tự giữa các con
của một nút
▪ Con trưởng/con cực trái của một nút: là con thứ nhất trong
quan hệ thứ tự giữa các nút cùng cha
▪ Em liền kề của một nút: là nút đứng ngay sau trong quan hệ thứ
tự giữa các nút cùng cha

❖Cây có nhãn: mỗi nút của cây được gán một nhãn. Nhãn
có thể là kiểu số nguyên, kiểu ký tự hay một kiểu dữ liệu
khác khác tạp hơn
❖Rừng:Tập hợp hữu hạn các cây phân biệt gọi là một rừng
(forest).
Chương 3. Cây

86

43


8/4/2020

3.1.2 Các khái niệm cơ bản về cây
1

A

B


E

F

2

D

C

G

H

J

I

K

3

4

Chương 3. Cây

87

3.2 Một số phép toán trên cây
❖Khởi tạo cây rỗng: void Initialize(TypeTree T);

❖Xác định nút gốc: Ref Root(TypeTree T);
❖Xác định nút cha của một nút:
Ref Parent(TypeTree T, TypeNode V);
❖Tìm con trưởng của một nút
Ref EldestChild(TypeTree T, TypeNode V);
❖Xác định em liền kề của một nút:
Ref NextSibling(TypeTree T,TypeNode V);
❖Duyệt cây: truy cập mọi nút để thực hiện một xử lý nào
đó →khơng sót, khơng lặp:
Void Traverse(TypeTree T);
Chương 3. Cây

88

44


8/4/2020

3.3 Cài đặt cây
3.3.1 Cài đặt cây bởi mảng
3.3.2 Cài đặt cây bởi danh sách các con
3.3.3 Cài đặt cây bằng con trỏ
3.3.4 Ứng dụng

Chương 3. Cây

89

3.3.1 Cài đặt cây bởi mảng

❖ Quy ước:

❖ Cho cây T có n nút
❖ Gán tên cho các nút lần lượt là 0, 1, 2, .., n-1.
❖ Dùng một mảng một chiều a để lưu trữ cây bằng cách cho a[i] = j
với j là nút cha của nút i. Nếu i là nút gốc ta cho a[i] = -1 vì nút
gốc khơng có cha
❖ Nếu cây T là cây có nhãn, ta có thể dùng thêm một mảng một
chiều L chứa các nhãn của cây bằng cách cho L[i] = x với x là
nhãn của nút i, hoặc khai báo a là một struct có ba trường: trường
Parent là một mảng giữ chỉ số nút cha; trường Data là một mảng
giữ nhãn của nút và một trường MaxNode giữ số nút hiện tại đang
có trên cây
Chương 3. Cây

90

45


8/4/2020

3.3.1 Cài đặt cây bởi mảng
❖Nhận xét
▪ Hàm PARENT(n,T) tốn chỉ một hằng thời gian
▪ Các hàm địi hỏi thơng tin về các con khơng làm việc tốt (vì phải tốn vịng lặp
để dị tìm), vd: tìm nút con trái nhất của nút i là không thể xác định được.

❖Khắc phục bằng qui ước:
▪ Đánh số theo thứ tự tăng dần bắt đầu tại nút gốc.

▪ Nút cha được đánh số trước các nút con.
▪ Các nút con cùng một nút cha được đánh số lần lượt từ trái sang phải

→Cách lưu trữ này chỉ phù hợp với cây mà các nút của cây khác nhau từng đôi một

Chương 3. Cây

91

3.3.1 Cài đặt cây bởi mảng
❖Ví dụ

0
A

1
B

2

3
4

D

7

E

F


5

G
8

C

I

6

J

H
9

A

B

C

D

E

I

J


F

G

H



Nhãn của các nút trên cây

-1

0

0

1

1

2

2

4

4

4




Cha của nút trên cây

0

1

2

3

4

5

6

7

8

9



Chỉ số của mảng

Chương 3. Cây


92

46


8/4/2020

3.3.1 Cài đặt cây bởi mảng
❖ Khai báo cấu trúc dữ liệu
#define MAXSIZE ... /* chỉ số tối đa của mảng */
typedef ... DataType;
typedef int Node;
typedef struct
{
DataType Data[MAXSIZE];/* Nhãn của nút trong cây */
Node Parent[MAXSIZE]; /* Cha của các nút trong cây */
int MaxNode; /* Số nút thực sự trong cây */
} Tree;

Chương 3. Cây

93

3.3.1 Cài đặt cây bởi mảng
❖Cài đặt các phép tốn
(u cầu sv viết chương trình)

Chương 3. Cây


94

47


8/4/2020

3.3.2 Cài đặt cây bởi danh sách các con
❖Quy ước:
▪ Mỗi nút có một danh sách các nút con.
▪ Vì số nút con của một nút là không biết trước nên dùng danh
sách liên kết.

❖Khai báo cấu trúc dữ liệu
typedef struct node
{
DataType Item;
node *next;
}
typedef node *childlist;
childlist tree[maxsize];
❖Ví dụ:
Chương 3. Cây

95

3.3.2 Cài đặt cây bởi danh sách các con

Chương 3. Cây


96

48


8/4/2020

3.3.2 Cài đặt cây bởi danh sách các con
❖Nhận xét
❖Các hàm địi hỏi thơng tin về các con làm việc rất
thuận lợi, nhưng hàm PARENT lại khơng làm
việc tốt.
❖Ví dụ: tìm nút cha của nút G địi hỏi ta phải duyệt
tất cả các danh sách chứa các nút con.

Chương 3. Cây

97

3.4 Cây nhị phân (Binary Tree)
3.4.1 Khái niệm
3.4.2 Biểu diễn và các thao tác trên cây
3.4.3 Ứng dụng

Chương 3. Cây

98

49



8/4/2020

3.4.1 Khái niệm
❖Cây nhị phân là cây mà mỗi đỉnh có tối đa 2 cây con
❖Cây nhị phân suy biến: cây lệch trái, cây lệch phải,
cây dích dắc
1

1

1
2

2

2

3

3
4

4

5

5

3


4

5

Chương 3. Cây

99

3.4.1 Khái niệm
❖Cây nhị phân hoàn chỉnh(Perfect/Full binary
tree): Là cây nhị phân mà mọi nút đều có đủ hai
con, trừ những nút ở mức cao nhất đều là nút lá
(khơng có con)

Chương 3. Cây

100

50


8/4/2020

3.4.1 Khái niệm
❖Cây nhị phân đầy đủ ( Complete Binary tree): là cây nhị
phân mà nếu liệt kê các nút theo trình tự từ mức thấp đến
mức cao, ở mỗi mức thì theo trình tự từ trái sang phải ta
sẽ được một dãy liên tục không khuyết nút nào. (cây đầy
đủ trái)


Chương 3. Cây

101

3.4.2 Biểu diễn và các phép toán trên cây
❖Biểu diễn bằng mảng
▪ Đánh số thứ tự các nút theo thứ tự “ trên –
dưới” và “trái – phải”.
▪ Với nút i thì
• nút con trái của nó 2i và nút con phải là 2i+1.
• Nút cha là [i/2].

Chương 3. Cây

102

51


8/4/2020

3.4.2 Biểu diễn và các phép tốn trên cây
❖Ví dụ
A

2

C
4


1

B

E

D
5

F
6

1

2

3

4

5

6

7

A

B


E

C

D

F

G

3

G
7

Chương 3. Cây

103

3.4.2 Biểu diễn và các phép toán trên cây
❖Ưu điểm:
▪ Cấu trúc mảng tạo thuận lợi khi triển khai các phép
tốn.
▪ Truy cập nhanh chóng vào bất cứ nút nào, chi phí truy
cập là đồng đều cho mọi nút. (từ con→cha và ngược
lại đều dễ dàng)

❖Nhược điểm:
▪ Lãng phí bộ nhớ nếu cây gầy, khuyết nhiều nút


Chương 3. Cây

104

52


8/4/2020

3.4.2 Biểu diễn và các phép toán trên cây
❖Biểu diễn bằng danh sách liên kết
❖Quy ước: Mỗi nút là một bản ghi bao gồm:
▪ Trường Data lưu giá trị
▪ Trường Left chứa liên kết trỏ tới nút con trái hoặc Null.
▪ Trường Right chứa liên kết trỏ tới nút con phải hoặc
Null.
→ Nút gốc sẽ là nút đầu tiên của danh sách móc nối, các
nút lá có trường Left và Right đều chứa giá trị Null.

Chương 3. Cây

105

3.4.2 Biểu diễn và các phép toán trên cây

Chương 3. Cây

106


53


8/4/2020

3.4.2 Biểu diễn và các phép toán trên cây
❖Khai báo cấu trúc dữ liệu
typedef struct node
{
int data;
struct node *left;
struct node *right;
}node;
typdef struct node *btree;

Chương 3. Cây

107

3.4.2 Biểu diễn và các phép toán trên cây
❖Duyệt cây nhị phân: là thực hiện một thao tác xử lý
phần dữ liệu trong mọi nút đúng một lần.
❖Quy tắc duyệt: nút nào cũng được ‘thăm’ và mỗi nút
được ‘thăm’ đúng một lần.
❖Cách duyệt: dựa theo thứ tự duyệt của nút gốc, cây con
trái và cây con phải. Phép duyệt được thực hiện một cách
đệ quy.
▪ Duyệt theo thứ tự trước (preorder traversal)
▪ Duyệt theo thứ tự giữa (inorder traversal)
▪ Duyệt theo thứ tự sau (postorder traversal)


Chương 3. Cây

108

54


8/4/2020

3.4.2 Biểu diễn và các phép toán trên cây
❖Duyệt theo thứ tự trước
▪ Thăm nút → xử lý dữ liệu
▪ Duyệt cây con trái theo thứ tự trước
▪ Duyệt cây con phải theo thứ tự trước

Thứ tự duyệt: abdce

Chương 3. Cây

109

3.4.2 Biểu diễn và các phép toán trên cây
❖Duyệt theo thứ tự sau:
▪ Duyệt cây con trái theo thứ tự
▪ Duyệt cây con phải theo thứ tự trước
▪ Thăm nút

Thứ tự duyệt: dbeca


Chương 3. Cây

110

55


8/4/2020

3.4.2 Biểu diễn và các phép toán trên cây
❖Duyệt theo thứ tự giữa
▪ Duyệt cây con trái theo thứ tự giữa
▪ Thăm nút
▪ Duyệt cây con phải theo thứ tự giưa

Thứ tự duyệt: bdaec

Chương 3. Cây

111

3.4.2 Biểu diễn và các phép tốn trên cây
❖Ví dụ:

Chương 3. Cây

112

56



8/4/2020

3.4.2 Biểu diễn và các phép toán trên cây
❖Cài đặt chương trình
void firstorder(btree t){ // duyệt thứ tự trước
if (t==NULL) exit(0);
else
{
cout<<" "<<t->data;
firstorder(t->left);
firstorder(t->right);
}
}
Chương 3. Cây

113

3.4.2 Biểu diễn và các phép toán trên cây
void inorder(btree t){//duyệt thứ tự giữa
if (t==NULL) exit(0);
else
{
inorder(t->left);
cout<<" "<<t->data;
inorder(t->right);
}
}
Chương 3. Cây


114

57


8/4/2020

3.4.3 Ứng dụng
❖Ứng dụng của phép duyệt cây






Tính chiều cao của cây (yêu cầu viết hàm)
Tính số nút/số nút lá của cây (yêu cầu viết hàm)
Tính kích thước của cây
Sao chép cây


❖ứng dụng của cây nhị phân
▪ Biều diễn biểu thức: Tính giá trị biểu thức, tính đạo hàm
▪ Cây quyết định

Chương 3. Cây

115

3.5 Cây nhị phân tìm kiếm

3.5.1 Khái niệm
3.5.2 Biểu diễn và các thao tác
3.5.3 Ứng dụng

Chương 3. Cây

116

58


8/4/2020

3.5.1 Khái niệm
❖Cây nhị phân tìm kiếm là một cây nhị phân mà mỗi nút
của nó đều được gán một giá trị khóa và mọi nút trên cây
phải thỏa mãn:
❖Giá trị của các nút của cây con trái nhỏ hơn giá trị của
nút gốc;
❖Giá trị của các nút cây con phải lớn hơn giá trị của nút
gốc;
❖Cây con trái và cây con phải cũng là cây tìm kiếm nhị
phân.
❖Các giá trị khóa là khác nhau.

Chương 3. Cây

117

3.5.1 Khái niệm

❖Ví dụ

Chương 3. Cây

118

59


8/4/2020

3.5.2 Biểu diễn và các thao tác
❖Biểu diễn giống như biểu diễn cây nhị phân nói
chung
❖Các phép tốn:





Tìm kiếm
Phép chèn
Phép xóa
Tạo một cây nhị phân tìm kiếm

Chương 3. Cây

119

3.5.2 Biểu diễn và các thao tác

❖Phép tìm kiếm:Có nút nào chứa giá trị bằng
khóa?
❖Giải thuật:
▪ Bắt đầu từ gốc, đối sánh giá trị nút với khóa:
▪ Bằng nhau thì Kết thúc
▪ Nhỏ hơn → thực hiện trên cây con trái
▪ Lớn hơn → thực hiện trên cây con phải

Chương 3. Cây

120

60


8/4/2020

3.5.2 Biểu diễn và các thao tác
❖Phép chèn thêm một phần tử có giá trị x
❖Giải thuật:
▪ Xin cấp bộ nhớ cho một nút mới,
▪ Gán giá trị mới vào trường Data của nút mới.
▪ Gán giá trị Null cho các trường Left và Right của nút mới.
Từ gốc, đối sánh với giá trị mới cần thêm vào:
▪ Nếu bằng nhau → kết thúc
▪ Ngược lại → duyệt theo cây con trái (nếu <) hoặc cây con phải
(nếu >)

Chương 3. Cây


121

3.5.2 Biểu diễn và các thao tác
Phép xóa
❖ Nếu nút x là nút lá ta chỉ cần “cắt bỏ” x
❖ Nếu x có một trong hai cây con là cây rỗng thì điều chỉnh lại
con trỏ của nút cha của x bằng cách trường liên kết tương ứng
thay vì trỏ đến x thì bây giờ trỏ tới nút gốc của cây con duy
nhất của x và giải phóng bộ nhớ đã cấp cho x
4

4

2

6

2

6


1

3

5

7


1

9
Chương 3. Cây

3

7

9
122

61


8/4/2020

3.5.2 Biểu diễn và các thao tác
4

4



2

2

5


7
1

3

1

7

3

6

6

9

9

Chương 3. Cây

123

3.5.2 Biểu diễn và các thao tác
Phép xóa
❖ Nếu nút x có hai cây con (có gốc tương ứng là x1 và x2)
và một trong hai cây con (chẳng hạn x1) không có con
thì ta thay nút x1 làm nút cha của cây con có gốc là x2.
Ta thay đổi trường liên kết như sau:
▪ Trường liên kết nút cha của x thay vì trỏ tới x thì nay trỏ tới nút

con x1.
▪ Trường liên kết của nút con x1 thay vì là null nay trỏ vào nút x2

Chương 3. Cây

124

62


8/4/2020

3.5.2 Biểu diễn và các thao tác

4

4



2

6

5

2

8
1


3

1

8

5

3

7
7

9

9

Chương 3. Cây

125

3.5.2 Biểu diễn và các thao tác
❖ Trường hợp tổng quát:
1. Thay giá trị của x bằng giá trị nút bên phải cùng
của cây con trái (hoặc bằng giá trị nút bên trái cùng
của cây con phải)
2. Cắt bỏ nút có giá trị vừa gán cho nút x.
Vì nút được lựa chọn để thay thế là bên phải/ trái cùng
nên không thể có hai con, việc cắt bỏ nó sẽ thực hiện

theo các cách đã nêu trên

Chương 3. Cây

126

63


8/4/2020

3.5.2 Biểu diễn và các thao tác
Phép xóa
4

3


5

2

1

2

7

3


6

5

7

1

6

9

9

Chương 3. Cây

127

3.5.2 Biểu diễn và các thao tác
❖Phép xóa
5

4

2

1

5


7

3

6
Chương 3. Cây

2

1

7

3

6

9

9
128

64


×