Professional Documents
Culture Documents
Bài giảng Cấu trúc dữ liệu và thuật toán - Chương 4 - Nguyễn Khánh Phương - 1405975
Bài giảng Cấu trúc dữ liệu và thuật toán - Chương 4 - Nguyễn Khánh Phương - 1405975
om
.c
ng
co
Cấu trúc dữ liệu và thuật toán
an
th
o ng
Nguyễn Khánh Phương
du
u
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Nội dung khóa học
Chương 1. Các khái niệm cơ bản
om
Chương 2. Các sơ đồ thuật toán
.c
ng
Chương 3. Các cấu trúc dữ liệu cơ bản
co
Chương 4. Cây
an
Chương 5. Sắp xếp th
o ng
du
Chương 7. Đồ thị
2
CuuDuongThanCong.com https://fb.com/tailieudientucntt
TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI
VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG
om
.c
ng
co
Chương 4. Cây
an
th
o ng
Nguyễn Khánh Phương
du
u
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Nội dung
1. Định nghĩa và các khái niệm
om
2. Biểu diễn cây
.c
3. Duyệt cây
ng
co
4. Cây nhị phân
an
th
o ng
du
u
cu
Become Rich
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Nội dung
1. Định nghĩa và các khái niệm
om
2. Biểu diễn cây
.c
3. Duyệt cây
ng
co
4. Cây nhị phân
an
th
o ng
du
u
cu
Become Rich
CuuDuongThanCong.com https://fb.com/tailieudientucntt
1. Định nghĩa và các khái niệm
1.1. Định nghĩa
om
1.2. Các thuật ngữ
.c
1.3. Cây có thứ tự (Ordered tree)
ng
co
an
th
o ng
du
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
1. Định nghĩa và các khái niệm
1.1. Định nghĩa
om
1.2. Các thuật ngữ
.c
1.3. Cây có thứ tự (Ordered tree)
ng
co
an
th
o ng
du
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
1.1. Định nghĩa
Cây gồm một tập các nút, có 1 nút đặc biệt gọi là gốc (root) và các
cạnh nối các nút.
om
Nút gốc
.c
Dusty
ng
nút
co
Honey B ear B randy
an
th
ng
B runhilde T erry C oyote Nugget
o
du
nút
NGUYỄN KHÁNH PHƯƠNG
Bộ môn KHMT – ĐHBK HN 8
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Cây: Định nghĩa đệ quy
• Bước cơ sở:
– Cây rỗng: cây không có nút nào
om
– Cây có 1 nút r : nút r được gọi là gốc của cây
.c
• Bước đệ quy:
ng
– Giả sử T1,T2,...,Tk là các cây với gốc tương ứng là r1,r2,...,rk
co
– Ta có thể xây dựng cây mới bằng cách đặt nút r làm cha (parent) của các nút
r1,r2,....,rk :
an
• Trong cây mới này: r là gốc; T1, T2, . . . , Tk là các cây con của gốc r; Các nút
th
r1,r2,....,rk được gọi là con (children) của nút r.
ng
r Gốc (Root)
o
du
u
cu
r1 r2 rk
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Các ứng dụng của cây
• Lịch thi đấu
• Cây gia phả
om
• Cây thư mục
.c
ng
• Cấu trúc của 1 quyển sách
co
• Cây biểu thức
an
• Sơ đồ phân cấp của 1 cơ quan
th
ng
• ….
o
du
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Các ứng dụng của cây: Biểu đồ lịch thi đấu
• Trong đời thường, cây thường được sử dụng để mô tả lịch
thi đấu của các giải thể thao theo thể thức đầu loại trực tếp
om
.c
ng
France France
co
Spain France
an
Brazil Brazil
th
UK ng Italia
Germany Germany
o
du
Ukraine
Italia Italia
Italia
u
cu
Argentina
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Các ứng dụng của cây: Cây gia phả
• Cây gia phả của các nhà toán học dòng họ Bernoulli
om
.c
Nikolaus
1623-1708
ng
co
Johan I Nikolaus Jacob I
an
1667-1748 1662-1716 1654-1705
th
ng
Nikolaus II Daniel Johan II Nikolaus I
o
1695-1726 1700-1782 1710-1790 1687-1759
du
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Các ứng dụng của cây: Cây thư mục
• Cây thư mục
om
.c
ng
co
an
th
o ng
du
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Các ứng dụng của cây: Mục lục 1 quyển sách
om
.c
ng
co
an
th
o ng
du
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Các ứng dụng của cây: Cây gia phả ngược (Ancestor Tree)
om
Ví dụ: Chiến có cha mẹ là: Thanh và Mai
.c
ng
co
Chiến
an
th
ng
Thanh Mai
o
du
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Các ứng dụng của cây: Cây biểu thức
om
+
.c
/ /
ng
co
an
1 3 * 4
th
o ng
6 7
du
u
cu
1/3 + 6*7 / 4
NGUYỄN KHÁNH PHƯƠNG
Bộ môn KHMT – ĐHBK HN
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Các ứng dụng của cây: Sơ đồ tổ chức của cơ quan
om
Công ty máy tính MU
.c
ng
co
Bộ phận bán hàng Bộ phận sản xuất Nghiên cứu và phát triên (R&D)
an
th
ng
Mỹ Quốc tế Laptops Desktops
o
du
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
1. Định nghĩa và các khái niệm
1.1. Định nghĩa
om
1.2. Các thuật ngữ
.c
1.3. Cây có thứ tự (Ordered tree)
ng
co
an
th
o ng
du
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
1.2. Các thuật ngữ
• Nút (node)
• Gốc (Root)
om
• Lá (leaf)
.c
• Con (child)
ng
co
• Cha (Parent)
an
• Tổ tiên (Ancestors)
th
• Hậu duệ (Descendants)
ng
• Anh em (Sibling)
o
du
CuuDuongThanCong.com https://fb.com/tailieudientucntt
1.2. Các thuật ngữ
• Gốc: nút không có cha (ví dụ: nút A)
• Anh em: nút có cùng cha (ví dụ: B, C, D là anh em; I, J, K là anh em; E và F là anh
em; G và H là anh em)
om
• Nút trong: nút có ít nhất 1 con (ví dụ: các nút màu xanh dương: A, B, C, F)
.c
• Nút ngoài (lá ): nút không có con (ví dụ: các nút xanh lá: E, I, J, K, G, H, D)
• Tổ tiên của 1 nút: là các nút cha / ông bà / cụ.. của nút đó.
ng
• Hậu duệ của 1 nút: là các nút con/cháu/chắt… của nút đó
co
• Cây con của 1 nút: là cây có gốc là con của nút đó
an
th
Ví dụ: A
Con của B: E, F
ng
Cha của E: B
o
du
Tổ tiên của F: B, A B C D
Hậu duệ của B: E, F, I, J, K
u
cu
E F G H
CuuDuongThanCong.com https://fb.com/tailieudientucntt
1.2. Các thuật ngữ
• Đường đi (Path): là 1 dãy các nút và các cạnh nối 1 nút đến 1 hậu duệ của nó
• Độ dài (Length) của đường đi = số lượng cạnh trên đường đi = số lượng nút trên đường đi - 1
om
(Ví dụ: Độ dài đường đi (A C E) = 2; độ dài đường đi (CF) = 1)
.c
Như vậy, đường đi độ dài 0 là đường đi từ 1 nút đến chính nó
ng
• Độ sâu/mức (Depth/level) của 1 nút N = 1 +độ dài đường đi từ gốc đến nút N
co
• Chiều cao (Height) của nút N = 1 + độ dài đường đi dài nhất từ N đến lá
an
• Chiều cao (sâu) của cây = chiều cao của gốc (= chiều cao lớn nhất của tất cả các nút trên cây)
th
ng
sâu=1 A cao=3
o
du
sâu=2 B sâu=2 C
cu
sâu=2 D
cao=1 cao=2
cao=1
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Chiều cao và độ sâu/mức
om
Sâu 1
Cao c = 5 7
.c
ng
c=4 3 10
co
4 sâu 2
an
8 12 th 11 2 sâu 3
ng
c=3
o
du
u
6 5 1 sâu 4
cu
c=2
CuuDuongThanCong.com https://fb.com/tailieudientucntt
1.2. Các thuật ngữ
• Bậc (Degree) của 1 nút: số lượng nút con của nút đó (= số lượng cây con
của nút đó)
• Bậc (Degree) của 1 cây: bậc lớn nhất của tất cả các nút trên cây
om
.c
Bậc = 2 A
ng
Bậc của cây = ?
co
2 B 3
an
C
th
ng
0 E F 1 0 G H 0 D 0
o
du
u
I J K
cu
0 0 0
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Bài tập: Các thuộc tính của cây
om
A
1) Số nút
.c
2) Nút gốc
ng
B C 3) Các nút lá
co
4) Các nút trong
5) Tổ tiên của H
an
D E F 6) Con cháu của B
th 7) Anh em của E
ng
8) Cây con phải của A
o
du
CuuDuongThanCong.com https://fb.com/tailieudientucntt
How we view a tree
root
om
.c
ng
co
an
th
o ng
du
root
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
1. Định nghĩa và các khái niệm
1.1. Định nghĩa
om
1.2. Các thuật ngữ
.c
1.3. Cây có thứ tự (Ordered tree)
ng
co
an
th
o ng
du
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
1.3. Cây có thứ tự (Ordered tree)
Cây có thứ tự là cây mà các nút được sắp xếp theo thứ tự
Ví dụ: Nếu T1 và T2 là cây có thứ tự thì T1 ≠ T2; nếu không T1 = T2
om
.c
ng
a a
co
an
b c th
ng
c b
o
du
T1 T2
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Nội dung
1. Định nghĩa và các khái niệm
om
2. Biểu diễn cây
.c
3. Duyệt cây
ng
co
4. Cây nhị phân
an
th
o ng
du
u
cu
28
CuuDuongThanCong.com https://fb.com/tailieudientucntt
2. Biểu diễn cây
• Một số cách cài đặt cây trên máy tính
– Mảng
om
– Danh sách các con (Lists of Children)
.c
– Con trái nhất, anh em bên phải (The Leftmost-Child, Right-Sibling)
ng
co
an
th
o ng
du
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
2. Biểu diễn cây: Mảng
• Giả sử cây T có n nút, được đánh số 1, 2, …, n.
• Ta sử dụng 1 mảng A để biểu diễn cây T như sau:
om
1
– A[i] = j nếu nút j là cha của nút i
.c
– Gốc của cây T không có cha, do đó A[1] = 0
2 3
ng
co
5 6
an
4 10
th
ng
7 8 9
A
o
0 1 1 2 2 3 6 6 6 3
du
A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] A[9] A[10]
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
2. Biểu diễn cây
• Một số cách cài đặt cây trên máy tính
– Mảng
om
– Danh sách các con (Lists of Children)
.c
– Con trái nhất, anh em bên phải (The Leftmost-Child, Right-Sibling)
ng
co
an
th
o ng
du
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
2. Biểu diễn cây: Danh sách các con
1 2 3
1
2 4 5
om
3 6 10
.c
3 4
2
5
ng
6 7 8 9
co
4 5 6 10 7
an
8 • Danh sách các con của nút 6
th
7 8 9
ng 9 • Ta dùng danh sách liên kết
10 để biểu diễn danh sách này
o
header
du
• Mỗi con trỏ header[i] trỏ đến đầu danh sách chứa các con của nút i trên cây
cu
• Danh sách các con của nút i: được biểu diễn bởi 1 danh sách liên kết
CuuDuongThanCong.com https://fb.com/tailieudientucntt
2. Biểu diễn cây
• Một số cách cài đặt cây trên máy tính
– Mảng
om
– Danh sách các con (Lists of Children)
.c
– Con trái nhất, em kế cận bên phải (The Leftmost-Child, Right-
ng
Sibling)
co
an
th
o ng
du
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
2. Biểu diễn cây : Con trái nhất, em kế cận bên phải
• Mỗi nút trên cây, có thể:
– Không có con nào, hoặc có duy nhất 1 con trái nhất
om
– Không có anh em nào, hoặc có duy nhất 1 anh em bên phải
.c
A
Ví dụ 1: nút B
ng
• Con trái nhất của B: E
co
• Anh em bên phải của B: C
an
B C D
th
ng Ví dụ 2: nút C
• Không có con
o
E F G H I • Con trái nhất của C:
du
J K L
Ví dụ 3: nút I
• Không có con
• Không có anh em bên phải 34
CuuDuongThanCong.com https://fb.com/tailieudientucntt
2. Biểu diễn cây : Con trái nhất, em kế cận bên phải
• Mỗi nút trên cây, có thể:
– Không có con nào, hoặc có duy nhất 1 con trái nhất
om
– Không có anh em nào, hoặc có duy nhất 1 anh em bên phải
.c
Do đó, để biểu diễn cây, ta sẽ lưu trữ các thông tin về con trái nhất và anh em
ng
bên phải của mỗi nút:
co
Data
an
Con trái nhất Em kế cận phải
typedef struct
th
{
ng
int data; // dữ liệu có trên mỗi nút
o
du
}treeNode;
treeNode * Root;
NGUYỄN KHÁNH PHƯƠNG
Bộ môn KHMT – ĐHBK HN 35
CuuDuongThanCong.com https://fb.com/tailieudientucntt
2. Biểu diễn cây : Con trái nhất, em kế cận bên phải
• Mỗi nút trên cây, có thể:
– Không có con nào, hoặc có duy nhất 1 con trái nhất
om
– Không có anh em nào, hoặc có duy nhất 1 anh em bên phải
.c
Do đó, để biểu diễn cây, ta sẽ lưu trữ các thông tin về con trái nhất và anh em
ng
bên phải của mỗi nút:
co
an
typedef struct
th
{
ng
int data; // dữ liệu có trên mỗi nút
o
du
}treeNode;
treeNode * Root;
NGUYỄN KHÁNH PHƯƠNG
Bộ môn KHMT – ĐHBK HN 36
CuuDuongThanCong.com https://fb.com/tailieudientucntt
2. Biểu diễn cây : Con trái nhất, em kế cận bên phải
A Data
Con trái nhất Em kế cận phải
om
B C D
.c
ng
E F G
co
A
an
H I J K
th
ng
B C D
o
du
u
E F G
cu
H I J K
CuuDuongThanCong.com https://fb.com/tailieudientucntt
2. Biểu diễn cây : Con trái nhất, em kế cận bên phải
1 Data
Con trái nhất Em kế cận phải
om
2 1
.c
2
3 5
ng
co
4 11 7
3 5
an
th
6 ng4
11 7
o
8
du
6
-2
u
9
cu
-2 9
NGUYỄN KHÁNH PHƯƠNG
Bộ môn KHMT – ĐHBK HN
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Nội dung
1. Định nghĩa và các khái niệm
om
2. Biểu diễn cây
.c
3. Duyệt cây
ng
co
4. Cây nhị phân
an
th
o ng
du
u
cu
39
CuuDuongThanCong.com https://fb.com/tailieudientucntt
3. Duyệt cây (Tree Traversal)
Có 3 phương pháp chính:
• Thứ tự trước (Preorder):
om
– Thăm nút gốc
.c
– Duyệt theo thứ tự trước các nút con (cây con)
ng
co
• Thứ tự sau (Postorder):
an
– Duyệt các con (cây con) theo thứ tự sau
– Thăm nút gốc th
o ng
du
– Duyệt con trái nhất (cây con trái nhất) theo thứ tự sau
– Thăm nút gốc
– Duyệt các con còn lại (không phải con trái nhất) theo thứ tự sau
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Duyệt thứ tự trước (Preorder Traversal)
Khi duyệt cây theo thứ tự trước, mỗi nút đều được thăm trước con cháu của nó.
Ví dụ: Duyệt cây T theo thứ tự trước:
om
procedure preorder(T: ordered rooted tree)
.c
r r := root of T
visit r Step 1
ng
for each child c of r from left to right
co
r1 r2 rk
begin
an
T(c) := subtree with c as its root
T1 T2 Tk
th
preorder(T(c)) Step 2, 3…
end
o ng
du
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Duyệt thứ tự trước (Preorder Traversal)
• Ứng dụng: in ra cấu trúc của một quyển sách
om
procedure preorder(T: ordered rooted tree)
.c
r := root of T
visit r
ng
for each child c of r from left to right
co
begin
an
T(c) := subtree with c as its root
th
preorder(T(c))
end
o ng
1
du
Become Rich
u
cu
2 5 9
1. Motivations 2. Methods 3. Success Stories
3 4 6 7 8
1.1 Enjoy 1.2 Help 2.1 Get a 2.2 Start a 2.3 Acquired
Life Poor Friends CS PhD Web Site by Google
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Duyệt thứ tự sau (Postorder Traversal)
Khi duyệt cây theo thứ tự sau, mỗi nút đều được thăm trước con cháu của nó.
Ví dụ: Duyệt cây T theo thứ tự sau:
om
r procedure postorder(T: ordered rooted tree)
.c
r := root of T
for each child c of r from left to right
ng
r2 rk
r1 begin
co
T(c) := subtree with c as its root
an
T1 T2 Tk postorder(T(c))
th
end
visit r
o ng
du
– ……..
– Bước k: thăm cây con Tk theo thứ tự sau,
– Bước k+1: thăm nút gốc r
NGUYỄN KHÁNH PHƯƠNG
Bộ môn KHMT – ĐHBK HN
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Duyệt thứ tự sau (Postorder Traversal)
• Ứng dụng: tính dung lượng bộ nhớ bị chiếm giữ bởi các file trong một thư
mục và các thư mục con của nó
om
procedure postorder(T: ordered rooted tree)
r := root of T
.c
for each child c of r from left to right
ng
begin
T(c) := subtree with c as its root
co
postorder(T(c))
an
end
th
ng visit r
9
o
cs16/
du
8
u
3 7
cu
todo.txt
homeworks/ programs/
1K
1 2 4 5 6
h1c.doc h1nc.doc DDR.java Stocks.java Robot.java
3K 2K 10K 25K 20K
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Duyệt thứ tự giữa (Inorder Traversal)
• Duyệt cây T theo thứ tự giữa:
r
om
procedure inorder(T: ordered rooted tree)
r := root of T
.c
r1 r2 rk if r is a leaf then visit r
ng
else
begin
co
T1 T2 Tk
l := first child of r from left to right
an
T(l) := subtree with l as its root
th
ng inorder(T(l)) Step 1
• Bước 1: thăm T1 theo thứ tự giữa,
o
visit r Step 2
du
• Bước 2: thăm nút gốc r, for each child c of r except for l left to right
• Bước 3: thăm T2 theo thứ tự giữa, T(c) := subtree with c as its root
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Thứ tự trước (PreOrder)
1. Thăm gốc
2. Thăm cây con trái nhất theo thứ tự trước b
om
3. Lần lượt thăm các cây con còn lại theo thứ tự trước
.c
e f
ng
co
an
th
ng j k
o
du
n o p
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
PreOrder
1. Thăm gốc
2. Thăm cây con trái nhất theo thứ tự trước b
om
3. Lần lượt thăm các cây con còn lại theo thứ tự trước
.c
e f
ng
co
an
th
ng j k
o
du
n o p
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
PreOrder
1. Thăm gốc
2. Thăm cây con trái nhất theo thứ tự trước
2.1. Thăm gốc b
om
2.2. Thăm cây con trái nhất theo preorder
2.3. Lần lượt thăm các cây con còn lại theo preorder
.c
3. Lần lượt thăm các cây con còn lại theo preorder
e f
ng
co
an
th
ng j k
o
du
n o p
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
PreOrder
1. Thăm gốc
2. Thăm cây con trái nhất theo preorder
2.1. Thăm gốc b
om
2.2. Thăm cây con trái nhất theo preorder
2.3. Lần lượt thăm các cây con còn lại theo preorder
.c
3. Lần lượt thăm các cây con còn lại theo preorder
e f
ng
co
an
th
ng j k
o
du
n o p
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
PreOrder
1. Thăm gốc
2. Thăm cây con trái nhất theo preorder
2.1. Thăm gốc b
om
2.2. Thăm cây con trái nhất theo preorder
2.3. Lần lượt thăm các cây con còn lại theo preorder
.c
3. Lần lượt thăm các cây con còn lại theo preorder
e f
ng
co
an
th
ng j k
o
du
n o p
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
PreOrder
1. Thăm gốc
2. Thăm cây con trái nhất theo preorder
2.1. Thăm gốc b
om
2.2. Thăm cây con trái nhất theo preorder
2.3. Lần lượt thăm các cây con còn lại theo preorder
.c
3. Lần lượt thăm các cây con còn lại theo preorder
e f
ng
co
an
j
th
ng k
o
du
n o p
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
PreOrder
1. Thăm gốc
2. Thăm cây con trái nhất theo preorder
2.1. Thăm gốc
b
om
2.2. Thăm cây con trái nhất theo preorder
.c
2.3. Lần lượt thăm các cây con theo preorder
2.3.1. Thăm gốc
e f
ng
2.3.2. Thăm cây con trái nhất theo preorder
co
2.3.3. Lần lượt thăm các cây con còn lại theo preorder
3. Lần lượt thăm các cây con còn lại theo preorder
an
j
th
ng k
o
du
n o p
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
PreOrder
1. Thăm gốc
2. Thăm cây con trái nhất theo preorder
2.1. Thăm gốc
b
om
2.2. Thăm cây con trái nhất theo preorder
.c
2.3. Lần lượt thăm các cây con theo preorder
2.3.1. Thăm gốc
e f
ng
2.3.2. Thăm cây con trái nhất theo preorder
co
2.3.3. Lần lượt thăm các cây con còn lại theo preorder
3. Lần lượt thăm các cây con còn lại theo preorder
an
j
th
ng k
o
du
n o p
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
PreOrder
1. Thăm gốc
2. Thăm cây con trái nhất theo preorder
2.1. Thăm gốc
b
om
2.2. Thăm cây con trái nhất theo preorder
.c
2.3. Lần lượt thăm các cây con theo preorder
2.3.1. Thăm gốc
e f
ng
2.3.2. Thăm cây con trái nhất theo preorder
co
2.3.3. Lần lượt thăm các cây con còn lại theo preorder
3. Lần lượt thăm các cây con còn lại theo preorder
an
j
th
ng k
o
du
n o p
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
PreOrder
1. Thăm gốc
2. Thăm cây con trái nhất theo preorder
2.1. Thăm gốc
b
om
2.2. Thăm cây con trái nhất theo preorder
.c
2.3. Lần lượt thăm các cây con theo preorder
2.3.1. Thăm gốc
e f
ng
2.3.2. Thăm cây con trái nhất theo preorder
co
2.3.3. Lần lượt thăm các cây con còn lại theo preorder
3. Lần lượt thăm các cây con còn lại theo preorder
an
j
th
ng k
o
du
n o p
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
PreOrder
1. Thăm gốc
2. Thăm cây con trái nhất theo preorder
2.1. Thăm gốc
b
om
2.2. Thăm cây con trái nhất theo preorder
.c
2.3. Lần lượt thăm các cây con theo preorder
2.3.1. Thăm gốc
e f
ng
2.3.2. Thăm cây con trái nhất theo preorder
co
2.3.3. Lần lượt thăm các cây con còn lại theo preorder
3. Lần lượt thăm các cây con còn lại theo preorder
an
j DONE
th
ng k
o
du
n o p
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
PreOrder
1. Thăm gốc
2. Thăm cây con trái nhất theo preorder
2.1. Thăm gốc
b
om
2.2. Thăm cây con trái nhất theo preorder
.c
2.3. Lần lượt thăm các cây con theo preorder
2.3.1. Thăm gốc
e DONE f
ng
2.3.2. Thăm cây con trái nhất theo preorder
co
2.3.3. Lần lượt thăm các cây con còn lại theo preorder
3. Lần lượt thăm các cây con còn lại theo preorder
an
j
th
ng k
o
du
n o p
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
PreOrder
1. Thăm gốc
2. Thăm cây con trái nhất theo preorder
2.1. Thăm gốc
b
om
2.2. Thăm cây con trái nhất theo preorder
.c
2.3. Lần lượt thăm các cây con theo preorder
2.3.1. Thăm gốc
e f
ng
2.3.2. Thăm cây con trái nhất theo preorder
co
2.3.3. Lần lượt thăm các cây con còn lại theo preorder
3. Lần lượt thăm các cây con còn lại theo preorder
an
j
th
ng k
o
du
n o p
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
PreOrder
1. Thăm gốc
2. Thăm cây con trái nhất theo preorder
2.1. Thăm gốc b
om
2.2. Thăm cây con trái nhất theo preorder
2.3. Lần lượt thăm các cây con theo preorder
.c
2.3.1. Thăm gốc
e f
ng
2.3.2. Thăm cây con trái nhất theo preorder
2.3.3. Lần lượt thăm các cây con còn lại theo preorder
co
3. Lần lượt thăm các cây con còn lại theo preorder
an
DONE
j
th
ng k
o
du
n o p
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Duyệt thứ tự giữa (Inorder Traversal)
• Duyệt cây T theo thứ tự giữa:
r
om
procedure inorder(T: ordered rooted tree)
r := root of T
.c
r1 r2 rk if r is a leaf then visit r
ng
else
begin
co
T1 T2 Tk
l := first child of r from left to right
an
T(l) := subtree with l as its root
th
ng inorder(T(l)) Step 1
• Bước 1: thăm T1 theo thứ tự giữa,
o
visit r Step 2
du
• Bước 2: thăm nút gốc r, for each child c of r except for l left to right
• Bước 3: thăm T2 theo thứ tự giữa, T(c) := subtree with c as its root
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
InOrder
1. Thăm cây con trái nhất theo InOrder
2. Thăm gốc b
om
3. Lần lượt thăm các cây con còn lại theo Inorder
.c
e f
ng
co
an
th
ng j k
o
du
n o p
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
InOrder
1. Thăm cây con trái nhất theo Inorder
1.1. Thăm cây con trái nhất theo Inorder
b
om
1.2. Thăm gốc
1.3. Thăm các cây con còn lại theo Inorder
.c
2. Thăm gốc
e f
ng
3. Thăm các cây con còn lại theo Inorder
co
an
th
ng j k
o
du
n o p
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
InOrder
1. Thăm cây con trái nhất theo Inorder
1.1. Thăm cây con trái nhất theo Inorder
b
om
1.2. Thăm gốc
1.3. Thăm lần lượt các cây con còn lại theo Inorder
.c
2. Thăm gốc
e f
ng
3. Thăm lần lượt các cây con còn lại theo Inorder
co
an
th
ng j k
o
du
n o p
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
InOrder
1. Thăm cây con trái nhất theo Inorder
1.1. Thăm cây con trái nhất theo Inorder
b
om
1.2. Thăm gốc
1.3. Thăm lần lượt các cây con còn lại theo Inorder
.c
2. Thăm gốc
e f
ng
3. Thăm lần lượt các cây con còn lại theo Inorder
co
an
th
ng j k
o
du
n o p
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
InOrder
1. Thăm cây con trái nhất theo Inorder
1.1. Thăm cây con trái nhất theo Inorder
b
om
1.2. Thăm gốc
1.3. Thăm lần lượt các cây con còn lại theo Inorder
.c
2. Thăm gốc
e f
ng
3. Thăm lần lượt các cây con còn lại theo Inorder
co
an
j
th
ng k
o
du
n o p
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
InOrder
1. Thăm cây con trái nhất theo Inorder
1.1. Thăm cây con trái nhất theo Inorder
b
om
1.2. Thăm gốc
1.3. Thăm lần lượt các cây con còn lại theo Inorder
.c
1.3.1. Thăm cây con trái nhất theo Inorder
e f
ng
1.3.2. Thăm gốc
1.3.3. Thăm lần lượt các cây con còn lại theo Inorder
co
2. Thăm gốc
an
3. Thăm lần lượt các cây con còn lại theo Inorder
j
th
ng k
o
du
n o p
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
InOrder
1. Thăm cây con trái nhất theo Inorder
1.1. Thăm cây con trái nhất theo Inorder
b
om
1.2. Thăm gốc
1.3. Thăm lần lượt các cây con còn lại theo Inorder
.c
1.3.1. Thăm cây con trái nhất theo Inorder
e f
ng
1.3.2. Thăm gốc
1.3.3. Thăm lần lượt các cây con còn lại theo Inorder
co
2. Thăm gốc
an
3. Thăm lần lượt các cây con còn lại theo Inorder
j
th
ng k
o
du
n o p
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
InOrder
1. Thăm cây con trái nhất theo Inorder
1.1. Thăm cây con trái nhất theo Inorder
b
om
1.2. Thăm gốc
1.3. Thăm lần lượt các cây con còn lại theo Inorder
.c
1.3.1. Thăm cây con trái nhất theo Inorder
e f
ng
1.3.2. Thăm gốc
1.3.3. Thăm lần lượt các cây con còn lại theo Inorder
co
2. Thăm gốc
an
3. Thăm lần lượt các cây con còn lại theo Inorder
j
th
ng k
o
du
n o p
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
InOrder
1. Thăm cây con trái nhất theo Inorder
1.1. Thăm cây con trái nhất theo Inorder
b
om
1.2. Thăm gốc
1.3. Thăm lần lượt các cây con còn lại theo Inorder
.c
1.3.1. Thăm cây con trái nhất theo Inorder
e f
ng
1.3.2. Thăm gốc
1.3.3. Thăm lần lượt các cây con còn lại theo Inorder
co
2. Thăm gốc
an
3. Thăm lần lượt các cây con còn lại theo Inorder
j
th
ng k
o
du
n o p
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
InOrder
1. Thăm cây con trái nhất theo Inorder
1.1. Thăm cây con trái nhất theo Inorder
b
om
1.2. Thăm gốc
1.3. Thăm lần lượt các cây con còn lại theo Inorder
.c
1.3.1. Thăm cây con trái nhất theo Inorder
e f
ng
1.3.2. Thăm gốc
1.3.3. Thăm lần lượt các cây con còn lại theo Inorder
co
2. Thăm gốc
an
3. Thăm lần lượt các cây con còn lại theo Inorder
j
th
ng k DONE
o
du
n o p
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
InOrder
1. Thăm cây con trái nhất theo Inorder
1.1. Thăm cây con trái nhất theo Inorder
b
om
1.2. Thăm gốc
1.3. Thăm lần lượt các cây con còn lại theo Inorder
.c
1.3.1. Thăm cây con trái nhất theo Inorder
e DONE f
ng
1.3.2. Thăm gốc
1.3.3. Thăm lần lượt các cây con còn lại theo Inorder
co
2. Thăm gốc
an
3. Thăm lần lượt các cây con còn lại theo Inorder
j
th
ng k
o
du
n o p
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
InOrder
1. Thăm cây con trái nhất theo Inorder
1.1. Thăm cây con trái nhất theo Inorder
b
om
1.2. Thăm gốc
1.3. Thăm lần lượt các cây con còn lại theo Inorder
.c
1.3.1. Thăm cây con trái nhất theo Inorder
e f
ng
1.3.2. Thăm gốc
1.3.3. Thăm lần lượt các cây con còn lại theo Inorder
co
2. Thăm gốc
an
3. Thăm lần lượt các cây con còn lại theo Inorder
j
th
ng k
o
du
n o p
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
InOrder
1. Thăm cây con trái nhất theo Inorder
1.1. Thăm cây con trái nhất theo Inorder
b
om
1.2. Thăm gốc
1.3. Thăm lần lượt các cây con còn lại theo Inorder
.c
1.3.1. Thăm cây con trái nhất theo Inorder
e f
ng
1.3.2. Thăm gốc
1.3.3. Thăm lần lượt các cây con còn lại theo Inorder
co
2. Thăm gốc
an
3. Thăm lần lượt các cây con còn lại theo Inorder
j
th
ng k
o
du
n o p
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Duyệt thứ tự sau (Postorder Traversal)
Khi duyệt cây theo thứ tự sau, mỗi nút đều được thăm trước con cháu của nó.
Ví dụ: Duyệt cây T theo thứ tự sau:
om
r procedure postorder(T: ordered rooted tree)
.c
r := root of T
for each child c of r from left to right
ng
r2 rk
r1 begin
co
T(c) := subtree with c as its root
an
T1 T2 Tk postorder(T(c))
th
end
visit r
o ng
du
– ……..
– Bước k: thăm cây con Tk theo thứ tự sau,
– Bước k+1: thăm nút gốc r
NGUYỄN KHÁNH PHƯƠNG
Bộ môn KHMT – ĐHBK HN
CuuDuongThanCong.com https://fb.com/tailieudientucntt
PostOrder
1. Thăm cây con trái nhất theo Postorder
2. Thăm lần lượt các cây con còn lại theo Postorder b
om
3. Thăm gốc
.c
e f
ng
co
an
th
ng j k
o
du
n o p
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
PostOrder
1. Thăm cây con trái nhất theo Postorder
1.1. Thăm cây con trái nhất theo Postorder b
om
1.2. Thăm lần lượt các cây con còn lại theo Postorder
1.3. Thăm gốc
.c
2. Thăm lần lượt các cây con còn lại theo Postorder
e f
ng
3. Thăm gốc
co
an
th
ng j k
o
du
n o p
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
PostOrder
1. Thăm cây con trái nhất theo Postorder
1.1. Thăm cây con trái nhất theo Postorder b
om
1.2. Thăm lần lượt các cây con còn lại theo Postorder
1.3. Thăm gốc
.c
2. Thăm lần lượt các cây con còn lại theo Postorder
e f
ng
3. Thăm gốc
co
an
th
ng j k
o
du
n o p
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
PostOrder
1. Thăm cây con trái nhất theo Postorder
1.1. Thăm cây con trái nhất theo Postorder b
om
1.2. Thăm lần lượt các cây con còn lại theo Postorder
1.3. Thăm gốc
.c
2. Thăm lần lượt các cây con còn lại theo Postorder
e f
ng
3. Thăm gốc
co
an
j
th
ng k
o
du
n o p
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
PostOrder
1. Thăm cây con trái nhất theo Postorder
1.1. Thăm cây con trái nhất theo Postorder b
om
1.2. Thăm lần lượt các cây con còn lại theo Postorder
1.2.1. Thăm cây con trái nhất theo Postorder
.c
1.2.2. Thăm lần lượt các cây con còn lại theo Postorder
e f
ng
1.2.3. Thăm gốc
co
1.3. Thăm gốc
2. Thăm lần lượt các cây con còn lại theo Postorder
an
3. Thăm gốc
j
th
ng k
o
du
n o p
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
PostOrder
1. Thăm cây con trái nhất theo Postorder
1.1. Thăm cây con trái nhất theo Postorder b
om
1.2. Thăm lần lượt các cây con còn lại theo Postorder
1.2.1. Thăm cây con trái nhất theo Postorder
.c
1.2.2. Thăm lần lượt các cây con còn lại theo Postorder
e f
ng
1.2.3. Thăm gốc
co
1.3. Thăm gốc
2. Thăm lần lượt các cây con còn lại theo Postorder
an
3. Thăm gốc
j
th
ng k
o
du
n o p
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
PostOrder
1. Thăm cây con trái nhất theo Postorder
1.1. Thăm cây con trái nhất theo Postorder b
om
1.2. Thăm lần lượt các cây con còn lại theo Postorder
1.2.1. Thăm cây con trái nhất theo Postorder
.c
1.2.2. Thăm lần lượt các cây con còn lại theo Postorder
e f
ng
1.2.3. Thăm gốc
co
1.3. Thăm gốc
2. Thăm lần lượt các cây con còn lại theo Postorder
an
3. Thăm gốc
j
th
ng k
o
du
n o p
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
PostOrder
1. Thăm cây con trái nhất theo Postorder
1.1. Thăm cây con trái nhất theo Postorder b
om
1.2. Thăm lần lượt các cây con còn lại theo Postorder
1.2.1. Thăm cây con trái nhất theo Postorder
.c
1.2.2. Thăm lần lượt các cây con còn lại theo Postorder
e f
ng
1.2.3. Thăm gốc
co
1.3. Thăm gốc
2. Thăm lần lượt các cây con còn lại theo Postorder
an
3. Thăm gốc
j
th
ng k
o
du
n o p
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
PostOrder
1. Thăm cây con trái nhất theo Postorder
1.1. Thăm cây con trái nhất theo Postorder b
om
1.2. Thăm lần lượt các cây con còn lại theo Postorder
1.2.1. Thăm cây con trái nhất theo Postorder
.c
1.2.2. Thăm lần lượt các cây con còn lại theo Postorder
e f
ng
1.2.3. Thăm gốc
co
1.3. Thăm gốc
2. Thăm lần lượt các cây con còn lại theo Postorder
an
3. Thăm gốc
j DONE
th
ng k
o
du
n o p
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
PostOrder
1. Thăm cây con trái nhất theo Postorder
1.1. Thăm cây con trái nhất theo Postorder b
om
1.2. Thăm lần lượt các cây con còn lại theo Postorder
1.2.1. Thăm cây con trái nhất theo Postorder
.c
1.2.2. Thăm lần lượt các cây con còn lại theo Postorder
e f
ng
1.2.3. Thăm gốc
co
1.3. Thăm gốc
2. Thăm lần lượt các cây con còn lại theo Postorder
an
3. Thăm gốc
j
th
ng k
o
du
n o p
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
PostOrder
1. Thăm cây con trái nhất theo Postorder
1.1. Thăm cây con trái nhất theo Postorder b
om
1.2. Thăm lần lượt các cây con còn lại theo Postorder
1.2.1. Thăm cây con trái nhất theo Postorder
.c
1.2.2. Thăm lần lượt các cây con còn lại theo Postorder
e f
ng
1.2.3. Thăm gốc
Done
co
1.3. Thăm gốc
2. Thăm lần lượt các cây con còn lại theo Postorder
an
3. Thăm gốc
j
th
ng k
o
du
n o p
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
PostOrder
1. Thăm cây con trái nhất theo Postorder
1.1. Thăm cây con trái nhất theo Postorder b
om
1.2. Thăm lần lượt các cây con còn lại theo Postorder
1.2.1. Thăm cây con trái nhất theo Postorder
.c
1.2.2. Thăm lần lượt các cây con còn lại theo Postorder
e f
ng
1.2.3. Thăm gốc
co
1.3. Thăm gốc
2. Thăm lần lượt các cây con còn lại theo Postorder
an
3. Thăm gốc
j
th
ng k
o
du
n o p
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
PostOrder
1. Thăm cây con trái nhất theo Postorder
1.1. Thăm cây con trái nhất theo Postorder b
om
1.2. Thăm lần lượt các cây con còn lại theo Postorder
1.2.1. Thăm cây con trái nhất theo Postorder
.c
1.2.2. Thăm lần lượt các cây con còn lại theo Postorder
e f
ng
1.2.3. Thăm gốc
co
1.3. Thăm gốc
2. Thăm lần lượt các cây con còn lại theo Postorder
an
3. Thăm gốc
j
th
ng k
o
du
n o p
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Ví dụ 1: Duyệt cây
Cho cây có thứ tự T có nút gốc 7. Hãy đưa ra thứ tự các nút được thăm nếu ta
duyệt cây T theo thứ tự:
om
• Trước (Preorder) 7
.c
• Giữa (Inorder)
ng
• Sau (Postorder)
co
3 10 4
an
th
ng
8 12 11 2
o
du
u
1
cu
6 5
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Ví dụ 2: Duyệt cây
Cho cây có thứ tự T có nút gốc a. Hãy đưa ra thứ tự các nút được thăm nếu ta
duyệt cây T theo thứ tự:
om
• Trước (Preorder) a
.c
• Giữa (Inorder)
ng
• Sau (Postorder)
co
b c d
an
th
ng
e f g h i
o
du
u
cu
j k l m
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Nội dung
1. Định nghĩa và các khái niệm
om
2. Biểu diễn cây
.c
3. Duyệt cây
ng
co
4. Cây nhị phân (Binary tree)
an
th
o ng
du
u
cu
90
CuuDuongThanCong.com https://fb.com/tailieudientucntt
4. Cây nhị phân (Binary tree)
4.1. Định nghĩa và tính chất
om
4.2. Biểu diễn cây nhị phân
.c
4.3. Duyệt cây nhị phân
ng
co
4.4. Một số ứng dụng
an
th
o ng
du
u
cu
91
CuuDuongThanCong.com https://fb.com/tailieudientucntt
4. Cây nhị phân (Binary tree)
4.1. Định nghĩa và tính chất
om
4.2. Biểu diễn cây nhị phân
.c
4.3. Duyệt cây nhị phân
ng
co
4.4. Một số ứng dụng
an
th
o ng
du
u
cu
92
CuuDuongThanCong.com https://fb.com/tailieudientucntt
4.1. Định nghĩa: Binary tree
• Cây nhị phân là cây mà mỗi nút có nhiều nhất là hai con.
Mỗi nút trên cây hoặc là: (1) không có con nào, (2) hoặc chỉ có con trái, (3)
om
hoặc chỉ có con phải, (4) hoặc có cả con trái và con phải
.c
• Mỗi nút đều có dữ liệu (data), một con trỏ trỏ đến con trái và một con trỏ trỏ
ng
đến con phải.
co
an
Con phải của a
Con trái của a
Data
th
ng
left right
o
pointer pointer
du
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Chú ý
a
a a
om
b b b
.c
ng
c d c d c d
co
an
e
e e
T1 ≠ T2
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Tính chất của cây nhị phân
height(cây) = depth(cây)
= MAX {depth(lá)} = height(gốc)
om
Bổ đề 1:
.c
1) max # số nút trên mức i = 2i-1 (i ≥ 1)
1) max # số lá = 2depth(tree)-1
ng
co
2) max # số nút = 2depth(tree) – 1
3) Cây nhị phân có n nút: depth(cây) ≥ log2(n)
an
th
ng h=5 Depth/level =1
o
h=4 l=2
du
u
l=3
cu
h=3
h=2 l=4
Height= 1 l=5 95
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Tính chất của cây nhị phân
Bổ đề 1:
1) max # số nút trên mức i = 2i-1 (i ≥ 1) : Mức i của cây nhị phân có số nút nhiều
om
nhất là 2i-1
.c
Chứng minh: Bằng qui nạp theo i.
ng
• Cơ sở: Gốc là nút duy nhất trên mức i=1. Như vậy số nút lớn nhất trên mức i=1
là 20= 2i-1.
co
• Chuyển qui nạp: Giả sử với mọi j, 1 ≤ j < i: số nút lớn nhất trên mức j là 2j-1.
an
– Do số nút trên mức i-1 là 2i -2, mặt khác theo định nghĩa mỗi nút trên cây nhị
phân có không quá 2 con
th
ng
số lượng nút lớn nhất trên mức i ≤ 2 * số lượng nút trên mức i-1
o
du
2* 2i – 2
u
2i-1
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Tính chất của cây nhị phân
Bổ đề 1:
2) max # số nút = 2depth(tree) – 1: cây nhị phân với chiều cao k có số nút nhiều
om
nhất là 2k-1, k ≥ 1.
.c
Chứng minh:
ng
Theo 1) có: Mức i của cây nhị phân có số nút nhiều nhất là 2i-1 (i ≥ 1)
co
Cây nhị phân chiều cao k có k mức
an
th
Tổng số nút trên cây nhều nhất chỉ có thế là
ng
k
o
i 1
2 2 k
1.
du
i 1
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Tính chất của cây nhị phân
Bổ đề 1:
3) Cây nhị phân có n nút: depth(cây) ≥ log2(n)
om
.c
Chứng minh:
ng
• Cây nhị phân n nút có chiều cao thấp nhất k khi số lượng nút ở các
co
mức i =1, 2, ..., k đều là lớn nhất có thể được. Từ đó ta có:
an
th
k
n 2i 1 2k 1, suy ra 2k n 1, hay k log 2 (n 1) .
ng
i 1
o
du
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Cây nhị phân đầy đủ (Full binary tree)
và Cây nhị phân hoàn chỉnh (Complete binary tree)
• Cây nhị phân đầy đủ: là cây nhị phân thỏa mãn 4
– Mỗi nút trong đều có 2 con,
om
– Mọi nút lá đều có cùng độ sâu 1 3
.c
2 16 9 10
ng
• Cây nhị phân hoàn chỉnh: là cây nhị phân thỏa mãn Full binary tree
co
– Tất cả các mức (có thể không kể đến mức sâu nhất) đều đầy
an
– Nếu mức sâu nhất không đầy, thì tất các nút ở mức này là lệch sang trái nhất có
thể được
th
o ng
du
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Tìm cây nhị phân đầy đủ / cây nhị phân hoàn chỉnh
om
.c
ng
co
an
th
o ng
du
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Cây nhị phân cân đối (balanced binary tree)
• Định nghĩa. Cây nhị phân được gọi là cân đối (balanced ) nếu chiều cao của
cây con trái và chiều cao của cây con phải của mọi nút chênh lêch nhau không
om
quá 1 đơn vị.
.c
ng
co
an
th
o ng
du
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Cây nhị phân cân đối (balanced binary tree)
• Định nghĩa. Cây nhị phân được gọi là cân đối (balanced ) nếu chiều cao của
cây con trái và chiều cao của cây con phải của mọi nút chênh lêch nhau không
om
quá 1 đơn vị.
• Nhận xét:
.c
– Nếu cây nhị phân là đầy đủ thì nó là hoàn chỉnh
ng
– Nếu cây nhị phân là hoàn chỉnh thì nó là cân đối
co
Ví dụ:
an
th
o ng
du
u
CuuDuongThanCong.com https://fb.com/tailieudientucntt
True or False?
a) Nếu cây nhị phân là đầy đủ thì nó là cân đối
om
b) Nếu cây nhị phân là hoàn chỉnh thì nó là đầy đủ
.c
ng
c) Nếu cây nhị phân là cân đối thì nó là hoàn chỉnh
co
an
d) Nếu cây nhị phân là cân đối thì nó là đầy đủ
th
o ng
du
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
4. Cây nhị phân (Binary tree)
4.1. Định nghĩa và tính chất
om
4.2. Biểu diễn cây nhị phân
.c
4.3. Duyệt cây nhị phân
ng
co
4.4. Một số ứng dụng
an
th
o ng
du
u
cu
104
CuuDuongThanCong.com https://fb.com/tailieudientucntt
4.2. Biểu diễn cây nhị phân
4.2.1. Mảng
om
4.2.2. Con trỏ
.c
ng
co
an
th
o ng
du
u
cu
105
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Mảng 1 chiều biểu diễn cây nhị phân
Các nút trên cây được đánh chỉ số như sau:
• Chỉ số 0: nút gốc,
om
• Tất cả các nút còn lại được đánh theo thứ tự từ trái sang phải, từ trên xuống dưới.
Các nút rỗng cũng được đánh số.
.c
Khi đó, nút được đánh chỉ số i sẽ được lưu vào thành phần thứ i của mảng.
ng
Mảng 1 chiều A dùng để biểu diễn cây nhị phân như sau:
co
• Gốc của cây là A[0]
an
• Với mỗi nút tại A[i]:
– Nút cha của nó là A[(i-1)/2]
th
ng
– Nút con trái của nó là A[2i + 1] và con phải của nó là A[2i + 2]
o
du
– Nếu nút không có con nào, thì các giá trị null sẽ được lưu tại các thành phần
tương ứng trên mảng.
u
cu
A 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ………………… 25 26 ….. 30
Con phải của K Con trái của J Con trái của C Con phải của C
Con trái của B
Con phải của B 106
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Mảng 1 chiều biểu diễn cây nhị phân
Depth/level =1 Max #nút = 20=1
om
.c
l=2 Max #nút = 21=2
ng
l=3
co
Max #nút = 22=4
an
th
ng l=4 Max #nút = 23=8
o
Max #núts = 24=16
du
u
𝑚𝑎𝑥#𝑛ú𝑡 = 31
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Mảng 1 chiều biểu diễn cây nhị phân hoàn chỉnh
om
.c
ng
co
an
th
ng
H D K B F J C P E G
o
du
A[0] A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] A[9]
u
cu
Sử dụng mảng 1 chiều biểu diễn cây nhị phân hoàn chỉnh n nút:
• Ta chỉ cần mảng 1 chiều gồm n phần tử
• Kiểm tra A[i] có phải là nút lá hay không ? NGUYỄN KHÁNH PHƯƠNG
Bộ môn KHMT – ĐHBK HN 108
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Mảng 1 chiều biểu diễn cây nhị phân
[0] A (1) Lãng phí bộ nhớ [0] A
A [1] B (2) thêm/xóa phức tạp
om
[1] B
[2] NULL
[2]
A C
.c
B [3] C D
[3]
ng
[4] NULL
[4] E
co
C [5] NULL
B C [5] F
an
[6] NULL
[6] G
th
D [7] D
ng
[7] H
D E F G
o
[8] L
du
NULL
E
u
cu
[15] E H L
CuuDuongThanCong.com https://fb.com/tailieudientucntt
4.2. Biểu diễn cây nhị phân
4.2.1. Mảng
om
4.2.2. Con trỏ
.c
ng
co
an
th
o ng
du
u
cu
110
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Sử dụng con trỏ để biểu diễn cây nhị phân
• Mỗi nút của cây sẽ có con trỏ trỏ đến con trái và con trỏ trỏ đến con phải.
• Nếu nút không có con trái hoặc con phải, thì con trỏ trỏ đấy con tương ứng
om
sẽ chứa giá trị NULL.
.c
• Nút lá con trỏ trái và con trỏ phải đều = NULL vì nó không có con nào.
ng
• Cấu trúc một nút trên cây nhị phân được định nghĩa trên ngôn ngữ C như
co
sau:
an
typedef struct
{
th
DataType data; /*data: dữ liệu của nút; DataType: int, char,
ng
double..*/
o
du
}node;
Trỏ đến nút con trái Trỏ đến nút con phải
data
NGUYỄN KHÁNH PHƯƠNG
Bộ môn KHMT – ĐHBK HN 111
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Sử dụng con trỏ để biểu diễn cây nhị phân: Ví dụ
A
om
B A
.c
ng
E C
co
B C D
an
F G D
th
H E F G
o ng
I
du
u
J
cu
H I J K
K
CuuDuongThanCong.com https://fb.com/tailieudientucntt
4. Cây nhị phân (Binary tree)
4.1. Định nghĩa và tính chất
om
4.2. Biểu diễn cây nhị phân
.c
4.3. Duyệt cây nhị phân
ng
co
4.4. Một số ứng dụng
an
th
o ng
du
u
cu
113
CuuDuongThanCong.com https://fb.com/tailieudientucntt
4.3. Duyệt cây nhị phân
• Duyệt cây tức là mỗi nút trên cây đều được thăm và
thăm đúng 1 lần
om
• Có hai cách duyệt cây thông dụng
.c
ng
– Duyệt theo chiều rộng (Breadth First Search)
co
– Duyệt theo chiều sâu (Depth First Search)
an
th
o ng
du
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
4.3. Duyệt cây nhị phân: theo chiều rộng
• Duyệt cây theo chiều rộng: thăm nút gốc trên mức 1, rồi thăm
đến các nút trên nút 2, rồi đến các nút trên mức 3, ...
om
• Các nút trên cùng 1 mức được thăm theo thứ tự từ trái sang phải
.c
ng
Depth/level =1
co
2
an
4 5 l=2
th
ng
7 3 10 8 l=3
o
du
1 9 l=4
11
u
cu
6 l=5
CuuDuongThanCong.com https://fb.com/tailieudientucntt
4.3. Duyệt cây nhị phân: theo chiều sâu
• Duyệt cây theo chiều sâu: lần lượt thăm các nút theo từng
nhánh
om
• Có ba loại duyệt cây theo chiều sâu
.c
– Thứ tự giữa Inorder
ng
co
– Thứ tự trước Preorder
an
– Thứ tự sau Postorder
th
• Mỗi loại duyệt đều có ứng dụng thực tế tương ứng với nó
o ng
du
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
4.3. Duyệt cây nhị phân: theo chiều sâu
• Thứ tự trước Preorder NLR
– Thăm nút (Visit a node),
om
– Thăm cây con trái theo thứ tự trước (Visit left subtree in preorder),
.c
– Thăm cây con phải theo thứ tự trước (Visit right subtree in preorder)
ng
• Thứ tự giữa Inorder LNR
co
– Thăm cây con trái theo thứ tự giữa (Visit left subtree in inorder),
– Thăm nút (Visit a node),
an
– Thăm cây con phải theo thứ tự giữa (Visit right subtree in inorder)
• Thứ tự sau Postorder LRN th
ng
– Thăm cây con trái theo thứ tự sau (visit left subtree in postorder),
o
du
– Thăm cây con phải theo thứ tự sau (isit right subtree in postorder),
– Thăm nút (Visit a node)
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Duyệt thứ tự trước (Preorder traversal – NLR)
• Thăm nút (Visit the node).
• Duyệt cây con trái (Traverse the left subtree).
om
• Duyệt cây con phải (Traverse the right subtree).
.c
ng
void printPreorder(node *root)
co
{ if( root != NULL )
{
an
printf("%s ", root->word);
th
printPreorder(root->left);
ng
printPreorder(root->right);
o
}
du
}
u
cu
Gọi: printPreorder(A);
A B D E F G H C L J M
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Duyệt thứ tự giữa (Inorder traversal – LNR)
• Duyệt cây con trái (Traverse the left subtree)
• Thăm nút (Visit the node)
om
• Duyệt cây con phải (Traverse the right subtree)
.c
ng
void printInorder(node *tree)
co
{
if( tree != NULL )
an
{
th
printInorder(tree->left);
ng
printf("%s ", tree->word);
o
du
printInorder(tree->right);
}
u
cu
}
Gọi: printInorder(A);
E D G F B H A L C M J
119
Cây con trái Cây con phải
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Duyệt thứ tự sau (Postorder traversal – LRN)
• Duyệt cây con trái (Traverse the left subtree)
• Duyệt cây con phải (Traverse the right subtree)
om
• Thăm nút (Visit the node)
.c
ng
void printPostorder(node *tree)
co
{
if( tree != NULL )
an
{
th
printPostorder(tree->left);
ng
printPostorder(tree->right);
o
du
}
Gọi: printPostorder(A);
E G F D H B L M J C A
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Các thao tác cơ bản trên cây nhị phân
typedef struct
{
om
char word[20]; // dữ liệu của nút
.c
struct node * left;
ng
struct node *right;
co
}node;
an
th
node* makeTreeNode(char *word); ng
node *insertNode(node* root, char *word, bool LEFT);
o
int countNodes(node *root);
du
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Các thao tác cơ bản trên cây nhị phân: MakeNode
node* makeTreeNode(char *word);
• Tham số đầu vào: dữ liệu của nút mới
om
• Đầu ra: hàm trả về con trỏ trỏ tới nút mới được tạo (tức là địa chỉ của nút được tạo)
Các bước phải thực hiện:
.c
• Cấp phát bộ nhớ cho nút mới. Kiểm tra cấp phát bộ nhớ có thành công hay không?
ng
– Nếu Yes: gán dữ liệu cho nút mới = word
co
con trỏ trỏ tới con trái = NULL
an
con trỏ tro tới con phải = NULL
th
• Trả về con trỏ trỏ tới nút mới (trả về địa chỉ của nút mới)
ng
o
du
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Các thao tác cơ bản trên cây nhị phân: thêm một nút mới vào cây
node *insertNode(node *tree, char *word, bool LEFT)
{
om
node *newNode, *p;
newNode = makeTreeNode(word);
.c
if ( tree == NULL ) return newNode;
ng
if (LEFT) //thêm nút vào vị trí trái nhất trên cây
{
co
p = tree;
an
while (p->left !=NULL) p = p->left;
th
p->left = newNode;
C
ng
printf("Nút %s là con trái của nút %s \n",word,(*p).word);
}
o
Gọi: RandomInsert(H, “C”, 1);
du
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Các thao tác cơ bản trên cây nhị phân: thêm một nút mới vào cây
node *insertNode(node *tree, char *word, bool LEFT)
{
om
node *newNode, *p;
newNode = makeTreeNode(word);
.c
if ( tree == NULL ) return newNode;
ng
if (LEFT) //thêm nút vào vị trí trái nhất trên cây
{
co
p = tree;
an
while (p->left !=NULL) p = p->left;
th
p->left = newNode;
C
ng
printf("Nút %s là con trái của nút %s \n",word,(*p).word);
}
o
Call: RandomInsert(H, “C”, 0);
du
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Các thao tác cơ bản trên cây nhị phân: tính chiều sâu của cây
int depth(node *root) { /* hàm tính chiều sâu của cây */
if( root == NULL ) return 0;
// Trường hợp cơ sở : nút lá. Khi đó cây chỉ có 1 nút => chiều sâu = 1.
om
if (root->left == NULL && root->right == NULL) return 1;
.c
// Nếu cây con trái NULL, gọi đệ quy trên cây con phải
ng
if (root->left==NULL) return depth(root->right) + 1;
co
// Nếu cây con phải NULL, gọi đệ quy trên cây con trái
an
if (root->right==NULL) return depth(root->left) + 1;
th
return min(depth(root->left), depth(root->right)) + 1;
ng
}
o
Gọi depth(H):
du
depth(D) + 1
u
cu
Min(depth(B), depth(F)) + 1
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Các thao tác cơ bản trên cây nhị phân: đếm số nút có trên cây
int countNodes(node *root) {
/* hàm đếm số nút trên cây*/
om
if( root == NULL ) return 0;
A
.c
else {
int ld = countNodes(root->left);
ng
B
int rd = countNodes(root->right);
co
return 1+ld+rd;
an
E C
}
}
th
ng
F G D
o
du
H
u
cu
#nút trên cây = 1 + #nút trên cây con trái + #nút trên cây con phải
Gọi countNodes(A); NGUYỄN KHÁNH PHƯƠNG
Bộ môn KHMT – ĐHBK HN
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Các thao tác cơ bản trên cây nhị phan: xóa cây
void freeTree(node *root)
{
om
if( root == NULL ) return;
.c
ng
freeTree(root->left);
co
freeTree(root->right);
an
free(root);
th
ng
}
o
du
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Program in C
/* The program for testing binary tree traversal */
#include <stdio.h>
#include <conio.h>
om
#include <string.h>
#include <stdlib.h>
.c
typedef struct {
ng
char word[20];
struct node * left;
co
struct node *right;
an
} node;
node *makeTreeNode(char *word);
th
node *insertNode(node* tree,char *word); ng
void freeTree(node *tree);
void printPreorder(node *tree);
o
du
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Program in C
void main() {
node *randomTree=NULL;
om
char word[20] = "a";
while( strcmp(word,"~")!=0)
.c
{ printf("\nEnter item (~ to finish): ");
ng
scanf("%s", word);
if (strcmp(word,"~")==0) printf(“Finish to input data for node... \n");
co
else randomTree = insertNode(randomTree,word, rand()%2);
an
}
th
printf("The tree in preorder:\n"); printPreorder(randomTree);
ng
printf("The tree in postorder:\n"); printPostorder(randomTree);
printf("The tree in inorder:\n"); printInorder(randomTree);
o
du
freeTree(randomTree);
}
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Bài tập
• Vẽ cây nhị phân có chiều cao = 3, kết quả duyệt thứ tự sau
là (10, 30, 50, 20, 40, 70, 60)
om
.c
ng
co
an
Postorder: Left_Right_Root
th
o ng
du
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
4. Cây nhị phân (Binary tree)
4.1. Định nghĩa và tính chất
om
4.2. Biểu diễn cây nhị phân
.c
4.3. Duyệt cây nhị phân
ng
co
4.4. Một số ứng dụng
an
th
o ng
du
u
cu
131
CuuDuongThanCong.com https://fb.com/tailieudientucntt
4.4. Một số ứng dụng
4.4.1. Biểu thức số học
om
4.4.2. Mã Huffman
.c
4.4.3. Cây quyết định
ng
co
an
th
o ng
du
u
cu
132
CuuDuongThanCong.com https://fb.com/tailieudientucntt
4.4. Một số ứng dụng
4.4.1. Biểu thức số học
om
4.4.2. Mã Huffman
.c
4.4.3. Cây quyết định
ng
co
an
th
o ng
du
u
cu
133
CuuDuongThanCong.com https://fb.com/tailieudientucntt
4.4.1. Biểu thức số học
• Cây biểu thức là cây nhị phân được sử dụng để biểu diễn biểu thức
số học, trong đó:
om
– Các nút trong: các phép toán
.c
– Các nút lá: các toán hạng
ng
Ví dụ 1: cây biểu thức biểu diễn biểu thức ((2 (5 - 1)) + (3 2))
co
Duyệt cây:
an
1. Theo thứ tự trước (preorder traversal)
th
+x2–51x32
Cho ta: kí pháp tiền tố (prefix expression)
ng
2. Theo thứ tự giữa (inorder traversal)
o
du
2 3 2 2x5–1+3x2
Cho ta: kí pháp trung tố (infix expression)
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
4.4.1. Biểu thức số học
Ví dụ 2: Duyệt cây:
1. Theo thứ tự trước (preorder traversal)
*
om
+**/ABCDE
E
Cho ta: kí pháp tiền tố (prefix expression)
.c
* 2. Theo thứ tự giữa (inorder traversal)
D
ng
A/B*C*D+E
Cho ta: kí pháp trung tố (infix expression)
co
/ C 3. Theo thứ tự sau (postorder traversal)
an
AB/C*D*E+
A B
th
Cho ta: kí pháp hậu tố (postfix expression)
ng
4. Theo mức (breath first traveral)
o
+*E*D/CAB
du
• Mức (độ sâu) của các nút trên cây cho biết trình tự thực hiện chúng (ta
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Kí pháp trung/hậu/tiền tố
(Infix/Postfix/Prefix Expressions)
• Trung tố: là biểu thức trong đó các toán hạng đặt bao quanh các phép
toán
om
Ví dụ: x+y, x+y*z
.c
• Hậu tố (còn gọi là Reverse Polish Notation): các phép toán được đặt
ng
sau các toán hạng
co
Ví dụ: xy+ , xyz*+
an
• Tiền tố (còn gọi là Known as Polish notation): các phép toán được đặt
trước các toán hạng
th
ng
Ví dụ: +xy, +x*yz
o
du
u
cu
x *
y z NGUYỄN KHÁNH PHƯƠNG
Bộ môn KHMT – ĐHBK HN 136
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Kí pháp trung tố (Infix Expressions)
• Trung tố: biểu thức trong đó các toán hạng đặt bao quanh các phép
toán
om
Cách tính giá trị biểu thức :
.c
a*b+c/d
ng
1) Dựa trên thứ tự ưu tiên của các phép toán:
co
ưutiên(*) = ưutiên(/) > ưutiên(+) = ưutiên(-)
an
2) Khi một toán hạng đặt giữa hai phép toán, thì toán hạng đó sẽ thuộc
th
về phép toán có thứ tự ưu tiên cao hơn.
o ng
du
137
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Ví dụ 1: Tính giá trị kí pháp hậu tố: sử dụng stack
• Tính giá trị kí pháp hậu tố sử dụng stack: 636+5*9/-
Quá trình tính toán thực hiện trên stack lần lượt như sau:
om
.c
Element = 6 STACK Element = 3 STACK Element = 6 STACK Element = + STACK
ng
Tính 3+6=9
co
an
Push 6 Pop 6
6
th
Push 3 Pop 3
3 3
ng
Push 6
6 6 6 6
o
du
u
cu
Push 9
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Ví dụ 1: Tính giá trị kí pháp hậu tố: sử dụng stack
• Evaluate the following postfix expression using stacks: 636+5*9/-
• The expression is evaluated by using stack as follows:
om
.c
STACK Element = 5 STACK Element = * STACK
ng
co
Tính 5*9=45
an
Push 5 Pop 5
5 5
th
Push 9 Pop 9
9 9 9
ng
6 6 6
o
du
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Tính giá trị kí pháp hậu tố sử dụng stack: 6 3 6 + 5 * 9 / -
STACK Element = 9 STACK Element = / STACK
om
.c
Tính 45/9=5
Pop 9
ng
Push 9 9 9
Push 45 Pop 45
co
45 45 45
an
6 6 6
th
ng
STACK Element = - STACK STACK
o
du
u
cu
Tính 6-5=1
Push 5 Pop 5
5 5
Pop 6 Push 1
6 6 1
Trạng thái cuối cùng của stack chứa kết quả của biểu thức
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Tính giá trị kí pháp hậu tố sử dụng stack
evaluationPostfix(stack S, postfixExpression E)
{ //Biểu thức được lưu ở mảng E
//Đọc các kí tự trong biểu thức từ trái sang phải:
om
i = 0;
.c
while ( i < số_kí_tự_trong_biểu_thức)
{
ng
if (E[i] là toán hạng)
push E[i] vào stack
co
else if (E[i] là phép toán)
an
{
1. Pop phần tử đầu stack và lưu vào biến operand1
th
2. Pop phần tử đầu stack và lưu vào biến in operand2
ng
3. Tính: operand2 op operand1 {op = E[i]}, rồi push kết quả vào
stack
o
}
du
i = i + 1;
u
}//end while
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Ví dụ 1:Tính kí pháp hậu tố: Kí tự của biểu thức Thao tác thực hiện Trạng thái Stack
636+5*9/- 1 6 Push 6 vào stack 6
2 3 Push 3 vào stack 6 3
3 6 Push 6 vào stack 6 3 6
4 + Pop 6 6 3
om
5 Pop 3 6
6 Tính 3 + 6 = 9 6
.c
7 Push 9 vào stack 6 9
ng
8 5 Push 5 vào stack 6 9 5
co
9 * Pop 5 6 9
10 Pop 9 6
an
11 Tính 9*5=45 6
Giá trị biểu thức = 1
th
12 ng Push 45 vào stack 6 45
13 9 Push 9 vào stack 6 45 9
o
14 / Pop 9 6 45
du
15 Pop 45 6
16 Tính 45/9=5 6
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Ví dụ 1: Tính giá trị kí pháp hậu tố: dùng stack
6 3 6 + 5 * 9 / -
om
3 +6 = 9
.c
6 9 5 * 9 / -
ng
9 * 5 = 45
co
Đọc biểu thức từ trái sang phải
6 45 9 / -
an
45 / 9 = 5
th
o ng
6 5 -
du
u
cu
6–5=1
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Ví dụ 2: Tính giá trị kí pháp tiền tố: sử dụng stack
+ - * 2 3 5 / * 2 3 2
2*3 =6
om
.c
+ - * 2 3 5 / 6 2
ng
6/2=3
co
Đọc biểu thức từ phải sang trái
+ - * 2 3 5 3
an
th
2*3=6
ng
+ - 6 5 3
o
du
u
6–5=1
cu
+ 1 3
1+3=4
NGUYỄN KHÁNH PHƯƠNG
144
Giá trị biểu thức = 4 Bộ môn KHMT – ĐHBK HN
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Ví dụ 2: Tính giá trị kí pháp tiền tố:
+-*235/*232
Kí tự của Thao tác thực hiện Trạng thái stack Kí tự của Thao tác thực hiện Trạng thái Stack
biểu thức biểu thức
om
1 2 Push 2 to stack 2 15 * Pop 2 3 5 3
2 3 Push 3 to stack 2 3 16 Pop 3 3 5
.c
3 2 Push 2 to stack 2 3 2 17 Evaluate 2*3=6 3 5
4 * Pop 2 2 3 18 Push 6 to stack 3 5 6
ng
5 Pop 3 2 19 - Pop 6 3 5
co
6 Evaluate 2 * 3 = 6 2 20 Pop 5 3
7 Push 6 to stack 2 6 21 Evaluate 6-5 = 1 3
an
8 / Pop 6 to stack 2 22 Push 1 to stack 3 1
th
9 Pop 2 Empty
ng 23 + Pop 1 3
10 Evaluate: 6/2=3 Empty 24 Pop 3 Empty
o
11 Push 3 to stack 3 25 Evaluate 1 + 3 = 4 Empty
du
14 2 Push 2 to stack 3 5 3 2
CuuDuongThanCong.com https://fb.com/tailieudientucntt
In biểu thức
Cho cây nhị phân có con trỏ root trỏ đến gốc của cây biểu diễn một biểu thức số học.
Viết hàm in ra biểu thức đó.
om
• Duyệt cây theo thứ tự giữa:
– In kí tự “(“ trước khi thực hiện duyệt cây con trái
.c
– In ra toán hạng hoặc phép toán có ở trong nút khi thực hiện thăm nút
ng
– In kí tự “)“ sau khi thăm xong cây con phải
co
void printTree(node *root)
an
if (root.left != NULL)
th
{
ng
printf("(");
printTree (root.left);
o
2 3 2
du
}
u
print(root.data);
5 1
cu
if (root.right != NULL)
Gọi printTree(+); {
Biểu thức in ra là: printTree (root.right);
((2 (5 - 1)) + (3 2)) printf (")");
}
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Tính giá trị biểu thức số học
Cho cây nhị phân có con trỏ root trỏ vào gốc của cây biểu diễn một biểu thức ố
học. Hãy viết hàm tính giá trị của biểu thức này.
om
• Duyệt cây theo thứ tự sau (Postorder traversal):
– Tính giá trị các cây con một cách đệ quy
.c
– Thực hiện phép toán ở nút gốc sau khi các cây con trái và phải của nó đã
ng
được tính xong giá trị.
co
an
th
int evaluate (node *root)
ng
{
if (root.left == NULL)//external node
o
2 3 2 return root.data;
du
5 1
cu
y = evaluate (root.right);
gọi OP là phép toán ở nút gốc root.data
z = x OP y
return z;
Gọi A = evaluate(+);
}
Giá trị của A là: }
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Bài tập: Tính giá trị biểu thức sử dụng stack
Bài tập 1: tính giá trị các kí pháp hậu tố
1) 2 3 + 4 * 5 * Cách 1: Miêu tả bẳng cách vẽ lần lượt trạng thái stack:
om
2) 27 3 2 ^ / 3 17 * + 27 2 * -
.c
3) 7 6 + 4 * 410 - 5 ^
ng
4) 7 5 – 9 2 / *
co
Bài tập 2: tính giá trị các kí pháp tiền tố
an
1) - + 7 * 4 5 + 2 10
2) - * 9 + 2 3 / 27 3
th Cách 2: Miêu tả các bước của thuật toán bằng cách kẻ bảng:
o ng
du
u
cu
Cách 3:
CuuDuongThanCong.com https://fb.com/tailieudientucntt
4.4. Một số ứng dụng
4.4.1. Biểu thức số học
om
4.4.2. Mã Huffman
.c
4.4.3. Cây quyết định
ng
co
an
th
o ng
du
u
cu
149
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Bài tập
• Giả sử ta cần lưu trữ một file gồm 100,000 kí tự. File này chỉ chứa 6 kí tự, với tần suất xuất
hiện như sau:
om
a b c d e f
.c
Frequency 45000 13000 12000 16000 9000 5000
ng
• Ta sẽ mã hóa mỗi kí tự bởi một xâu nhị phân (gọi là codeword). Do đó, ta cần tìm một dãy
các bit nhị phân mã hóa file này sao cho số bit sử dụng là ít nhất có thể, tức là tìm cách mã
co
hóa sao cho sử dụng bộ nhớ ít nhất.
an
• Có hai cách mã hóa:
th
– Mã hóa với độ dài cố định (fixed-length code): các codeword đều có độ dài bằng nhau.
o ng
– Mã hóa với độ dài biến đổi (variable-length code): các codeword có độ dài khác nhau.
du
• Ví dụ: nếu sử dụng mã với độ dài cố định, thì với file văn bản đã cho, với 6 kí tự, ta cần ít
u
a b c d e f
Frequency 45000 13000 12000 16000 9000 5000
A fixed-length 000 001 010 011 100 101
A variable-length 0 101 100 111 1101 1100
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Bài tập
• Ví dụ: nếu sử dụng mã với độ dài cố định, thì với file văn bản đã cho, với 6 kí tự, ta cần ít
nhất 3 bit cho mỗi codeword (vì 22 = 4 < 6, 23 = 8)
om
a b c d e f
Frequency 45000 13000 12000 16000 9000 5000
.c
A fixed-length 000 001 010 011 100 101
ng
A variable-length 0 101 100 111 1101 1100
co
• Mã hóa với độ dài cố định (fixed length-code) cần:
an
3 * 100000 = 300000 bits để lưu trữ file đã cho
th
ng
3 bit cho mỗi kí tự Số lượng kí tự trong file
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Bài tập
Có thể mã hóa bằng 2 cách:
• Mã hóa với độ dài cố định (fixed-length code): các codeword có độ dài bằng nhau
om
dễ mã hóa cũng như giải mã, nhưng lại đòi hỏi bộ nhớ lớn.
.c
• Mã hóa với độ dài biến đổi (variable-length code): các codeword có thể có độ dài khác
ng
nhau
co
– Kí tự có tần suất xuất hiện nhiều nhất (ít nhất) sẽ được mã hóa bởi codeword có độ
dài ngắn nhất (dài nhất).
an
th
– Mỗi codeword phải được xác định duy nhất, không phụ thuộc vào độ dài của nó
không có codeword nào là đoạn đầu của một codeword khác (ví dụ: {a = 1, b = 110,
ng
c = 10, d = 111}, thì khi giải mã “1101111” ta thu được xâu ?)
o
du
Mã phi tiền tố (Prefix code): là cách mã hóa mỗi kí tự c bởi một xâu nhị phân
code(c) sao cho mã của một kí tự bất kì không là đoạn đầu của bất cứ mã của ký tự nào
u
trong số các kí tự còn lại (ví dụ: {a = 0, b = 110, c = 10, d = 111} là mã phi tiền tố
cu
a b c d e f
Frequency 45000 13000 12000 16000 9000 5000
A fixed-length 000 001 010 011 100 101
A variable-length 0 101 100 111 1101 1100
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Bài toán mã hóa tối ưu (Optimum source coding problem)
• Mã hóa với độ dài biến đổi sử dụng 224000 bit thay vì 300000 bits nếu sử dụng
mã hóa với độ dài cố định tiết kiệm bộ nhớ 25%. Câu hỏi: có cách mã hóa
om
nào tốt hơn không ? Hay đây đã là cách mã hóa tối ưu (cho chi phí nhỏ nhất) ?
.c
a b c d e f
Frequency 45000 13000 12000 16000 9000 5000
ng
A fixed-length 000 001 010 011 100 101
co
A variable-length 0 101 100 111 1101 1100
an
• Bài toán mã hóa tối ưu: Cho bảng kí tự A = {a1, . . . , an} với tần suất xuất hiện
th
f(ai), hãy tìm mã phi tiền tố C cho bảng kí tự A sao cho số lượng bit cần sử dụng
ng
là nhỏ nhất
o
du
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Bài toán mã hóa tối ưu (Optimum source coding problem)
• Bài toán mã hóa tối ưu: Cho bảng kí tự A = {a1, . . . , an} với tần suất xuất hiện
f(ai), hãy tìm mã phi tiền tố C cho bảng kí tự A sao cho số lượng bit cần sử dụng
om
là nhỏ nhất
.c
ng
co
Cần để mã hóa file gồm kí tự, với:
an
– là xâu nhị phân để mã hóa kí tự ,
– là độ dài của
th
.
ng
David A. Huffman
1925-1999
o
du
Huffman đã đề xuất một thuật toán tham lam để giải quyết bài toán mã
u
cu
hóa tối ưu, tức là xây dựng được một mã phi tiền tố với tổng số bit sử
dụng là ít nhất. Mã đó được gọi là mã Huffman.
NGUYỄN KHÁNH PHƯƠNG
Bộ môn KHMT – ĐHBK HN
CuuDuongThanCong.com https://fb.com/tailieudientucntt
4.4.2 Mã Huffman
Thuật toán:
• Bước 1: Lấy 2 kí tự có tần suất xuất hiện nhỏ nhất x, y từ bảng kí tự A, rồi
om
xây dựng cây con gồm 2 nút lá chứa 2 kí tự này (ý tưởng tham lam). Gán
.c
nhãn cho nút gốc của cây này là z.
ng
• Bước 2: Đặt tần suất xuất hiện f(z) = f(x) + f(y). Xóa x, y và thêm z tạo nên
co
bảng kí tự mới: khi đó |
an
Lặp lại 2 bước trên, đặt tên là ghép, với bảng kí tự mới cho đến khi bảng kí
th
tự chỉ còn gồm 1 kí tự.
ng
Cây thu được chính là mã Huffman
o
du
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
4.4.2 Mã Huffman
• Cho A = {a / 20, b / 15, c / 5, d /15, e / 45} là bảng kí tự cùng tần suất xuất
hiện của các kí tự.
om
• Bước thứ 1: mã Huffman sẽ ghép c và d
.c
ng
co
an
th
Bảng kí tự mới A1 = {a / 20, b / 15, n1 / 20, e / 45}
ng
• Thuật toán tiếp tục ghép a và b (hoặc có thể ghép b và n1)
o
du
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
4.4.2 Mã Huffman
Bảng kí tự mới A2 = {n2 / 35, n1 / 20, e / 45}
Ghép n1 và n2:
om
.c
ng
co
an
Bảng kí tự mới A3 = {n3 / 55, e / 45}
Ghép e và n3, và thuật toán kết thúc
th
o ng
du
CuuDuongThanCong.com https://fb.com/tailieudientucntt
4.4.2 Mã Huffman
• Tần suất của các kí tự trong văn bản: Char Freq
om
E 125
T 93
.c
A 80
ng
O 76
co
I 72
an
N 71
th S 65
ng
R 61
o
du
H 55
u
L 41
cu
D 40
C 31
U 27
CuuDuongThanCong.com https://fb.com/tailieudientucntt
4.4.2 Mã Huffman
om
.c
ng
co
an
th
ng
A O T E
o
80 76 93 125
du
u
D L R S N I H
cu
40 41 61 65 71 73 55
C U
31 27
CuuDuongThanCong.com https://fb.com/tailieudientucntt
4.4.2 Mã Huffman
om
.c
ng
co
an
th
ng
A O T E
o
80 76 93 125
du
u
D L R S N I H
cu
40 41 61 65 71 73 58 55
C U
31 27
CuuDuongThanCong.com https://fb.com/tailieudientucntt
4.4.2 Mã Huffman
om
.c
ng
co
an
th
ng
A O T E
o
80 76 93 125
du
81
u
D L R S N I H
cu
40 41 61 65 71 73 58 55
C U
31 27
CuuDuongThanCong.com https://fb.com/tailieudientucntt
4.4.2 Mã Huffman
om
.c
ng
co
an
th
ng
A O T E
o
80 76 93 125 113
du
81
u
D L R S N I H
cu
40 41 61 65 71 73 58 55
C U
31 27
CuuDuongThanCong.com https://fb.com/tailieudientucntt
4.4.2 Mã Huffman
om
.c
ng
co
an
th
ng
A O T E
o
80 76 93 126 125 113
du
81
u
D L R S N I H
cu
40 41 61 65 71 73 58 55
C U
31 27
CuuDuongThanCong.com https://fb.com/tailieudientucntt
4.4.2 Mã Huffman
om
.c
ng
co
an
th
ng
A O T E
o
80 76 93 126 144 125 113
du
81
u
D L R S N I H
cu
40 41 61 65 71 73 58 55
C U
31 27
CuuDuongThanCong.com https://fb.com/tailieudientucntt
4.4.2 Mã Huffman
om
.c
ng
co
an
th
156 ng
A O T E
o
80 76 93 126 144 125 113
du
81
u
D L R S N I H
cu
40 41 61 65 71 73 58 55
C U
31 27
CuuDuongThanCong.com https://fb.com/tailieudientucntt
4.4.2 Mã Huffman
om
.c
ng
co
an
th
156 174 ng
A O T E
o
80 76 93 126 144 125 113
du
81
u
D L R S N I H
cu
40 41 61 65 71 73 58 55
C U
31 27
CuuDuongThanCong.com https://fb.com/tailieudientucntt
4.4.2 Mã Huffman
om
.c
ng
co
an
th
156 174 ng 238
A O T E
o
126 144 113
du
81
u
D L R S N I H
cu
58
C U
CuuDuongThanCong.com https://fb.com/tailieudientucntt
4.4.2 Mã Huffman
om
.c
ng
co
an
270
th
156 174 ng 238
A O T E
o
80 76 93 126 144 125 113
du
81
u
D L R S N I H
cu
40 41 61 65 71 73 58 55
C U
31 27
CuuDuongThanCong.com https://fb.com/tailieudientucntt
4.4.2 Mã Huffman
om
.c
ng
330
co
an
270
th
156 174 ng 238
A O T E
o
80 76 93 126 144 125 113
du
81
u
D L R S N I H
cu
40 41 61 65 71 73 58 55
C U
31 27
CuuDuongThanCong.com https://fb.com/tailieudientucntt
4.4.2 Mã Huffman
om
.c
ng
330 508
co
an
270
th
156 174 ng 238
A O T E
o
80 76 93 126 144 125 113
du
81
u
D L R S N I H
cu
40 41 61 65 71 73 58 55
C U
31 27
CuuDuongThanCong.com https://fb.com/tailieudientucntt
4.4.2 Mã Huffman
0 1
om
838
.c
ng
0 330 1 0 508 1
co
an
0 174 1 0 1 0 1
0 156 1 270
th
ng 238
A O T E
o
80 76 93 0 126 0 144 125 0 113 1
0 81 1 1 1
du
u
D L R S N I H
cu
40 41 61 65 71 73 0 58 1 55
C U
31 27
CuuDuongThanCong.com https://fb.com/tailieudientucntt
4.4.2 Mã Huffman
Char Frequency Fixed-length code Huffman code
E 125 0000 110
om
T 93 0001 011
A 80 0010 000
.c
O 76 0011 001
I 73 0100 1011
ng
N 71 0101 1010
S 65 0110 1001
co
R 61 0111 1000
H 55 1000 1111
an
L 41 1001 0101
th
D 40 1010 0100
C 31 1011 11100
ng
U 27 1100 11101
o
Sum 838 3352 3036
du
CuuDuongThanCong.com https://fb.com/tailieudientucntt
4.4.2 Mã Huffman: giải mã
• Thuật toán giải mã:
– Đọc file nén & xây dựng cây nhị phân
om
– Sử dụng cây nhị phần để giải mã
.c
• Đi từ nút gốc đến nút lá
ng
• Ví dụ: Giải mã “11100000011”
co
an
th
o ng
du
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
4.4. Một số ứng dụng
4.4.1. Biểu thức số học
om
4.4.2. Mã Huffman
.c
4.4.3. Cây quyết định (Decision tree)
ng
co
an
th
o ng
du
u
cu
174
CuuDuongThanCong.com https://fb.com/tailieudientucntt
4.4.2 Mã Huffman: giải mã
procedure Huffman_Decode(B)
//B là xâu mã hóa văn bản theo mã Huffman
begin
om
<Khởi tạo P là gốc của cây Huffman>
While <chưa đạt đến kết thúc của B> do
.c
begin
ng
x bit tiếp theo trong xâu B;
If x = 0 then P Con trái của P
co
Else P Con phải của P
an
If (P là nút lá) then
th
begin ng
<Hiển thị kí hiệu tương ứng với nút lá>
o
<Đặt lại P là gốc của cây Huffman>
du
end;
u
end;
cu
end;
CuuDuongThanCong.com https://fb.com/tailieudientucntt
4.4.3. Cây quyết định (Decision Tree)
• Cây quyết định là một cây mà mỗi đỉnh trong của nó tương ứng với một truy
vấn đối với dữ liệu. Các cạnh của cây tương ứng với các khả năng trả lời cho
om
câu hỏi. Mỗi lá của cây tương ứng với một đầu ra.
.c
• Để tính toán với cây quyết định chúng ta sẽ bắt đầu từ gốc và di chuyển theo
ng
một đường đi đến lá. Tại mỗi nút trung gian câu trả lời cho truy vấn đối với
co
dữ liệu sẽ dẫn ta đến nút tiếp theo. Khi đạt đến lá ta thu được một đầu ra.
an
th
o ng
du
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
4.4.3. Cây quyết định
Ví dụ. Bài toán tra từ điển. Cho mảng A gồm n số được sắp theo thứ tự tăng dần và một số
x. Cần xác định xem x có mặt trong mảng đã cho hay không. Nếu câu trả lời là khẳng định
cần chỉ rõ vị trí của x trong mảng A.
om
• Cây quyết định để giải bài toán này có dạng một cây nhị phân:
.c
– Mỗi nút trong của cây quyết định chứa một câu hỏi dạng: “x < k ?”
ng
– Mỗi nút ở mức sát lá của cây quyết định chứa câu hỏi : “x = A[i]?”
co
có hai con, một con ứng với ‘i’ còn một con ứng với ‘-’ (không có).
an
Ví dụ: Xét A = (2, 3, 5, 7, 11, 13, 17, 19). Cây quyết định có dạng sau đây
th
o ng
du
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
4.4.3. Cây quyết định
• Ta xác định thời gian của thuật toán cây quyết định là số truy vấn
trên đường đi từ gốc đến lá. Như vậy, thời gian tính trong tình
om
huống xấu nhất của thuật toán sẽ là độ cao của cây quyết định.
.c
ng
• Nếu ta hạn chế chỉ được sử dụng phép so sánh để giải bài toán tra
co
từ điển, thì rõ ràng hoạt động của mọi thuật toán giải bài toán tra từ
an
điển đều có thể mô tả bởi cây quyết định.
th
• Do đó nếu đánh giá được cận dưới cho độ cao của cây quyết định
o ng
(thuật toán) giải bài toán tra từ điển thì ta cũng thu được cận dưới
du
CuuDuongThanCong.com https://fb.com/tailieudientucntt
4.4.3. Cây quyết định
• Giả thiết rằng: “Các truy vấn đối với dữ liệu phải đảm bảo đủ thông tin để có thể xác
định được đầu ra có thể”.
om
• Nếu bài toán có N đầu ra có thể thì rõ ràng mọi cây quyết định đều có N lá (không loại
.c
trừ tình huống khi có một số lá tương ứng với cùng một đầu ra).
ng
• Từ bổ đề 1, ta biết rằng: Nếu một cây có n lá và mỗi nút có nhiều nhất 2 nút con (mỗi
co
truy vấn có nhiều nhất 2 câu trả lời) thì độ cao của cây ít nhất sẽ là
log n = (log n)
an
th
• Áp dụng kết quả này: Với bài toán tra từ điển với tập S gồm n phần tử, do bài toán có tất
ng
cả n+1 đầu ra có thể, nên mọi cây quyết định có n+1 lá, và vì thế, có độ cao ít nhất là
o
log (n+1) = (log n).
du
• Suy ra: Mọi thuật toán giải bài toán tra từ điển chỉ sử dụng phép so sánh đều có
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Bài toán sắp xếp
• Cho dãy n số phân biệt (a[1], a[2], ..., a[n]), tìm hoán vị = ((1), (2), ...,(n)) sao
cho: a[(1)] < a[(2)] < ... < a[(n)].
om
• Giả sử ta chỉ sử dụng phép so sánh để thực hiện sắp xếp, khi đó mọi thuật toán sắp
xếp đều có thể diễn tả trong mô hình cây quyết định. Cây quyết định là cây nhị phân
.c
thoả mãn:
ng
– Mỗi nút một phép so sánh "a < b"
co
• cũng có thể coi tương ứng với một không gian con các trình tự
an
– Mỗi cạnh rẽ nhánh theo câu trả lời (true hoặc false)
th
– Mỗi lá 1 trình tự sắp xếp ng
– Cây quyết định có bao nhiêu lá, nếu có n phần tử phân biệt cần sắp xếp?
o
• n!, tức là tất cả các trình tự có thể
du
• Đối với mỗi bộ dữ liệu, chỉ có 1 lá chứa trình tự sắp xếp cần tìm
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Cây quyết định cho bài toán sắp xếp ba số a, b, c
om
c < a < b, a < c < b,
b < a < c, c < b < a
.c
a<b<c "a < b?" b<c<a
c<a<b a<b a>b
ng
b<a<c
a<c<b c<b<a
co
"a < c?" "b < c?"
an
a<c a>c b<c b>c
th
a<b<c c<a<b b<c<a c<b<a
ng
a<c<b b<a<c
o
"b < c?" "c < a?"
du
181
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Bài toán sắp xếp
• Do có tất cả n! hoán vị, nên mọi cây quyết định giải bài toán sắp xếp yêu
cầu ít nhất n! lá, vì thế có độ cao ít nhất là (log n!).
om
Ta có:
.c
log n! = log 1+log 2 +...+ logn
ng
≥ log(n/2) + log(n/2+1) +...+ log n
co
≥ (n/3) log(n/2)
an
= (1/3) (n log n - n log 2)
= (n log n). th
o ng
• Như vậy, ta đã chứng minh được kết quả sau đây:
du
"Mọi thuật toán sắp xếp chỉ sử dụng phép so sánh đều đòi hỏi thời
u
CuuDuongThanCong.com https://fb.com/tailieudientucntt