You are on page 1of 182

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
Cấu trúc dữ liệu và thuật toán
an
th
o ng
Nguyễn Khánh Phương
du
u

Computer Science department


cu

School of Information and Communication technology


E-mail: phuongnk@soict.hust.edu.vn

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 6. Tìm kiếm


u
cu

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

Computer Science department


cu

School of Information and Communication technology


E-mail: phuongnk@soict.hust.edu.vn

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

Force Others Rob Stock


to be Poor Banks Fraud 4

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

Force Others Rob Stock


to be Poor Banks Fraud 5

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

NGUYỄN KHÁNH PHƯƠNG


Bộ môn KHMT – ĐHBK HN 6

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

NGUYỄN KHÁNH PHƯƠNG


Bộ môn KHMT – ĐHBK HN 7

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

Gill T ansey T weed Zoe C rocus Primrose Nous B elle


u
cu

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

T1 T2 Tk NGUYỄN KHÁNH PHƯƠNG


Bộ môn KHMT – ĐHBK HN 9

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

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: 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

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: 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

Johan III Jacob II


1746-1807 1759-1789

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: Cây thư mục
• Cây thư mục

om
.c
ng
co
an
th
o ng
du
u
cu

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: Mục lục 1 quyển sách

om
.c
ng
co
an
th
o ng
du
u
cu

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: Cây gia phả ngược (Ancestor Tree)

• Mỗi người đều có bố mẹ:

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

Giang Minh Thành Lan Anh

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: 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

Châu Âu Châu Á Canada

NGUYỄN KHÁNH PHƯƠNG


Bộ môn KHMT – ĐHBK HN

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

NGUYỄN KHÁNH PHƯƠNG


Bộ môn KHMT – ĐHBK HN 18

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

• Nút trong (Internal node)


u

• Chiều cao (Height)


cu

• Chiều sâu (Depth)

NGUYỄN KHÁNH PHƯƠNG


Bộ môn KHMT – ĐHBK HN

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

Cây con của nút A


I J K

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 (CF) = 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

Chiều cao của cây= 3


u

sâu=2 B sâu=2 C
cu

sâu=2 D
cao=1 cao=2
cao=1

sâu=3 E sâu=3 F NGUYỄN KHÁNH PHƯƠNG


Bộ môn KHMT – ĐHBK HN
cao=1 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

9 Chiều cao của cây = 5 sâu 5


Cao c=1

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

NGUYỄN KHÁNH PHƯƠNG


Bộ môn KHMT – ĐHBK HN

CuuDuongThanCong.com https://fb.com/tailieudientucntt
Bài tập: Các thuộc tính của cây

Thuộc tính Giá trị

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

9) Cây con trái của A


G
u

10) Chiều cao của cây


cu

11) Bậc của cây


H I

NGUYỄN KHÁNH PHƯƠNG


Bộ môn KHMT – ĐHBK HN

CuuDuongThanCong.com https://fb.com/tailieudientucntt
How we view a tree

root

om
.c
ng
co
an
th
o ng
du

root
u
cu

Nature Lovers View Computer Scientists View

NGUYỄN KHÁNH PHƯƠNG


Bộ môn KHMT – ĐHBK HN 25

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

NGUYỄN KHÁNH PHƯƠNG


Bộ môn KHMT – ĐHBK HN 26

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

NGUYỄN KHÁNH PHƯƠNG


Bộ môn KHMT – ĐHBK HN 27

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

NGUYỄN KHÁNH PHƯƠNG


Bộ môn KHMT – ĐHBK HN 29

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

NGUYỄN KHÁNH PHƯƠNG


Bộ môn KHMT – ĐHBK HN 30

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

NGUYỄN KHÁNH PHƯƠNG


Bộ môn KHMT – ĐHBK HN 31

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

Header : mảng các con trỏ


u

• 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

NGUYỄN KHÁNH PHƯƠNG


Bộ môn KHMT – ĐHBK HN 32

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

NGUYỄN KHÁNH PHƯƠNG


Bộ môn KHMT – ĐHBK HN 33

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

• Anh em bên phải của C: D


u
cu

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

struct treeNode * con_trái_nhất;


u

struct treeNode * em_kế_cận_phải;


cu

}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

struct treeNode * con_trái_nhất;


u

struct treeNode * em_kế_cận_phải;


cu

}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

• Thứ tự sau (Inorder):


u
cu

– 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

– Bước 1: thăm nút gốc r,


u

– Bước 2: thăm cây con T1 theo thứ tự trước,


cu

– Bước 3: thăm cây con T2 theo thứ tự trước


– ……..
– Bước k+1: thăm cây con Tk theo thứ tự trước
NGUYỄN KHÁNH PHƯƠNG
Bộ môn KHMT – ĐHBK HN

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 1: thăm cây con T1 theo thứ tự sau,


u

– Bước 2: thăm cây con T2 theo thứ tự sau,


cu

– ……..
– 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

• …….. inorder(T(c)) Step 3, 4..

• Bước k+1: thăm Tk theo thứ tự giữa end

NGUYỄN KHÁNH PHƯƠNG


Bộ môn KHMT – ĐHBK HN

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

b NGUYỄN KHÁNH PHƯƠNG


Bộ môn KHMT – ĐHBK HN

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

b NGUYỄN KHÁNH PHƯƠNG


Bộ môn KHMT – ĐHBK HN

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

b NGUYỄN KHÁNH PHƯƠNG


Bộ môn KHMT – ĐHBK HN

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

be NGUYỄN KHÁNH PHƯƠNG


Bộ môn KHMT – ĐHBK HN

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

be j NGUYỄN KHÁNH PHƯƠNG


Bộ môn KHMT – ĐHBK HN

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

be j NGUYỄN KHÁNH PHƯƠNG


Bộ môn KHMT – ĐHBK HN

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

be j k NGUYỄN KHÁNH PHƯƠNG


Bộ môn KHMT – ĐHBK HN

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

be j k n NGUYỄN KHÁNH PHƯƠNG


Bộ môn KHMT – ĐHBK HN

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

be j k n o NGUYỄN KHÁNH PHƯƠNG


Bộ môn KHMT – ĐHBK HN

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

be j k n o p NGUYỄN KHÁNH PHƯƠNG


Bộ môn KHMT – ĐHBK HN

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

be j k n o p NGUYỄN KHÁNH PHƯƠNG


Bộ môn KHMT – ĐHBK HN

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

be j k n o p NGUYỄN KHÁNH PHƯƠNG


Bộ môn KHMT – ĐHBK HN

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

be j k n o p f NGUYỄN KHÁNH PHƯƠNG


Bộ môn KHMT – ĐHBK HN

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

be j k n o p f NGUYỄN KHÁNH PHƯƠNG


Bộ môn KHMT – ĐHBK HN

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

• …….. inorder(T(c)) Step 3, 4..

• Bước k+1: thăm Tk theo thứ tự giữa end

NGUYỄN KHÁNH PHƯƠNG


Bộ môn KHMT – ĐHBK HN

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

NGUYỄN KHÁNH PHƯƠNG


Bộ môn KHMT – ĐHBK HN

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

NGUYỄN KHÁNH PHƯƠNG


Bộ môn KHMT – ĐHBK HN

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

j NGUYỄN KHÁNH PHƯƠNG


Bộ môn KHMT – ĐHBK HN

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

j e NGUYỄN KHÁNH PHƯƠNG


Bộ môn KHMT – ĐHBK HN

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

j e NGUYỄN KHÁNH PHƯƠNG


Bộ môn KHMT – ĐHBK HN

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

j e n NGUYỄN KHÁNH PHƯƠNG


Bộ môn KHMT – ĐHBK HN

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

j e n k NGUYỄN KHÁNH PHƯƠNG


Bộ môn KHMT – ĐHBK HN

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

j e n k o NGUYỄN KHÁNH PHƯƠNG


Bộ môn KHMT – ĐHBK HN

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

j e n k o p NGUYỄN KHÁNH PHƯƠNG


Bộ môn KHMT – ĐHBK HN

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

j e n k o p NGUYỄN KHÁNH PHƯƠNG


Bộ môn KHMT – ĐHBK HN

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

j e n k o p NGUYỄN KHÁNH PHƯƠNG


Bộ môn KHMT – ĐHBK HN

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

j e n k o p b NGUYỄN KHÁNH PHƯƠNG


Bộ môn KHMT – ĐHBK HN

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

j e n k o p b f 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)
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 1: thăm cây con T1 theo thứ tự sau,


u

– Bước 2: thăm cây con T2 theo thứ tự sau,


cu

– ……..
– 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

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
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

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
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

j 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
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

j 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
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

j 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
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

j n 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
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

j n o 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
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

j n o p 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
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

j n o p k 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
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

j n o p k e 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
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

j n o p k e 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
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

j n o p k e f 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
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

j n o p k e f b NGUYỄN KHÁNH PHƯƠNG


Bộ môn KHMT – ĐHBK HN

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

9 NGUYỄN KHÁNH PHƯƠNG


Bộ môn KHMT – ĐHBK HN

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

n o p 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 (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

NGUYỄN KHÁNH PHƯƠNG


Bộ môn KHMT – ĐHBK HN 93

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

Cây nhị phân T1


th
Cây nhị phân T2 Cây tổng quát
o ng
du

T1 ≠ T2
u
cu

NGUYỄN KHÁNH PHƯƠNG


Bộ môn KHMT – ĐHBK HN

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

NGUYỄN KHÁNH PHƯƠNG


Bộ môn KHMT – ĐHBK HN

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

NGUYỄN KHÁNH PHƯƠNG


Bộ môn KHMT – ĐHBK HN

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

NGUYỄN KHÁNH PHƯƠNG


Bộ môn KHMT – ĐHBK HN

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

NGUYỄN KHÁNH PHƯƠNG


99
Complete binary tree Bộ môn KHMT – ĐHBK HN

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

NGUYỄN KHÁNH PHƯƠNG


Bộ môn KHMT – ĐHBK HN

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

NGUYỄN KHÁNH PHƯƠNG


Bộ môn KHMT – ĐHBK HN

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

1. Cây nào là đầy đủ?


cu

2. Cây nào là hoàn chỉnh?


3. Cây nào là cân đối?

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

NGUYỄN KHÁNH PHƯƠNG


Bộ môn KHMT – ĐHBK HN

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

H D K B F J NULL NULL NULL A NULL NULL C NULL

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

NGUYỄN KHÁNH PHƯƠNG


Bộ môn KHMT – ĐHBK HN 109

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

struct node *left ; /* trỏ đến nút con trái */


struct node *right; /* trỏ đến nút con phải */
u
cu

}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

NGUYỄN KHÁNH PHƯƠNG


Bộ môn KHMT – ĐHBK HN

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

NGUYỄN KHÁNH PHƯƠNG


Bộ môn KHMT – ĐHBK HN

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

• Breadth_First_Search(2): 2, 4, 5, 7, 3, 10, 8, 1, 9, 11, 6

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

NGUYỄN KHÁNH PHƯƠNG


Bộ môn KHMT – ĐHBK HN

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

NGUYỄN KHÁNH PHƯƠNG


Bộ môn KHMT – ĐHBK HN 117

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

Cây con trái Cây con phải


118

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

printf("%s ", tree->word);


}
u
cu

}
Gọi: printPostorder(A);
E G F D H B L M J C A

Cây con trái Cây con phải 120

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

int depth(node *root);


u
cu

void freeTree(node *root);


void printPreorder(node *root);
void printPostorder(node *root);
void printInorder(node *root); NGUYỄN KHÁNH PHƯƠNG
Bộ môn KHMT – ĐHBK HN 121

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

NGUYỄN KHÁNH PHƯƠNG


Bộ môn KHMT – ĐHBK HN 122

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

else { //thêm nút vào vị trí phải nhất trên cây


p = tree;
u
cu

while (p->right !=NULL) p = p->right;


p->right = newNode;
printf("Nút %s là con phải của nút %s \n", word,(*p).word);
}
return tree; 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ị 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

else { //thêm nút vào vị trí phải nhất trên cây


p = tree;
u
cu

while (p->right !=NULL) p = p->right;


p->right = newNode;
printf("Nút %s là con phải của nút %s \n", word,(*p).word);
}
return tree; 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ị 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

1 1 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ị 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

NGUYỄN KHÁNH PHƯƠNG


Bộ môn KHMT – ĐHBK HN

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

void printPostorder(node *tree);


void printInorder(node *tree);
u

int countNodes(node *tree);


cu

int depth(node *tree);

NGUYỄN KHÁNH PHƯƠNG


Bộ môn KHMT – ĐHBK HN

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

printf("The number of nodes is: %d\n",countNodes(randomTree));


printf("The depth of the tree is: %d\n", depth(randomTree));
u
cu

freeTree(randomTree);
}

NGUYỄN KHÁNH PHƯƠNG


Bộ môn KHMT – ĐHBK HN

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

NGUYỄN KHÁNH PHƯƠNG


Bộ môn KHMT – ĐHBK HN

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

3. Theo thứ tự sau (postorder traversal)


5 1 251–x32x+
Cho ta: kí pháp hậu tố (postfix expression)
4. Theo mức (breath first traveral)
+xx2–3251 134

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

không cần sử dụng ngoặc để chỉ ra trình tự).


• Phép toán tại mức cao hơn của cây được thực hiện muộn hơn so với các mức
dưới chúng.
• Phép toán ở gốc luôn được thực hiện sau cùng.
135

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

Toán hạng b đặt giữa phép * và + ==> b thuộc về phép *


u
cu

Toán hạng c đặt giữa phép + và / ==> c thuộc về phép /


Do đó: a* b + c / d = (a*b) + (c/d)

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

NGUYỄN KHÁNH PHƯƠNG


Bộ môn KHMT – ĐHBK HN

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

NGUYỄN KHÁNH PHƯƠNG


Bộ môn KHMT – ĐHBK HN

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

Pop phần tử đầu stack, lưu vào biến Result;


return Result; //chứa kết quả của biểu thức
}

NGUYỄN KHÁNH PHƯƠNG


Bộ môn KHMT – ĐHBK HN 141

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

17 Push 5 vào stack 6 5


18 - Pop 5 6
19 Pop 6 Empty
20 Tính 6-5=1 Empty
21 Push 1 vào stack 1 142
22 Pop value = 1 Empty

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

Tính giá trị biểu thức = 1


NGUYỄN KHÁNH PHƯƠNG
Bộ môn KHMT – ĐHBK HN 143

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

12 5 Push 5 to stack 3 5 26 Push 4 to stack 4


13 3 Push 3 to stack 3 5 3 27 Pop value = 4 Empty
u
cu

14 2 Push 2 to stack 3 5 3 2

Giá trị biểu thức = 4


145

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

else { //internal node


x = evaluate (root.left);
u

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

nhất 3 bit cho mỗi codeword (vì 22 = 4 < 6, 23 = 8)


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 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

• Mã hóa với độ dài thay đổi (variable-length code) cần:


o
du

1 * 45000 + 3*13000+ 3*12000 + 3 * 16000 + 4 * 9000 + 4 * 5000 = 224000 bit


u
cu

#bit sử dụng để mã hóa kí tự “a” #bit sử dụng để mã hóa kí tự “f”

 Tiết kiệm bộ nhớ: 25%


NGUYỄN KHÁNH PHƯƠNG
Bộ môn KHMT – ĐHBK HN

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

Cần để mã hóa file gồm kí tự, với:


– là xâu nhị phân để mã hóa kí tự ,
NGUYỄN KHÁNH PHƯƠNG
– là độ dài của . Bộ môn KHMT – ĐHBK HN

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

NGUYỄN KHÁNH PHƯƠNG


Bộ môn KHMT – ĐHBK HN

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

Bảng kí tự mới A2 = {n2 / 35, n1: / 20, e / 45}

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

Mã Huffman thu được:


u
cu

a = 000, b = 001, c = 010, d = 011, e = 1


Là mã phi tiền tố tối ưu
(cho tổng số bít sử dụng ít nhất)

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

• Sử dụng mã Huffman: tiết kiệm bộ nhớ 10%


u
cu

• Mã Huffman là ví dụ đơn giản của mã hóa dữ liệu

NGUYỄN KHÁNH PHƯƠNG


Bộ môn KHMT – ĐHBK HN

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

NGUYỄN KHÁNH PHƯƠNG


Bộ môn KHMT – ĐHBK HN

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

cho độ phức tạp của bài toán.


u
cu

NGUYỄN KHÁNH PHƯƠNG


Bộ môn KHMT – ĐHBK HN 178

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

thời gian tính là (log n).


• Như đã biết: Thuật toán tìm kiếm nhị phân có thời gian tính là O(log n). Từ các kết quả
trên suy ra: “Thuật toán tìm kiếm nhị phân là thuật toán nhanh nhất trong số các
thuật toán chỉ sử dụng phép so sánh để giải bài toán tra từ điển”. 179

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

NGUYỄN KHÁNH PHƯƠNG


Bộ môn KHMT – ĐHBK HN 180

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

a < b < c, b < c < a,

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

b<c b>c c<a c>a


u
cu

a<b<c a<c<b b<c<a b<a<c

Mỗi lá tương ứng với một trình tự sắp xếp ba số a, b, c

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

gian (n log n)".


cu

NGUYỄN KHÁNH PHƯƠNG


Bộ môn KHMT – ĐHBK HN 182

CuuDuongThanCong.com https://fb.com/tailieudientucntt

You might also like