You are on page 1of 60

Đại Học Bách Khoa Hà Nội

Viện Điện Tử - Viễn Thông

om
LẬP TRÌNH

.c
ng
Phần 3: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT

co
an
th
Chương 11: Cấu trúc cây ng
o
du
u
cu

Bộ Môn ĐT-KTMT - Viện ĐT-VT. Chương 11: Cấu trúc cây 1


CuuDuongThanCong.com https://fb.com/tailieudientucntt
Nội dung
• Các khái niệm cơ bản
– Mô tả cấu trúc cây (tree)

om
– Các khái niệm cơ bản trong cây

.c
– Các tính chất cơ bản

ng
– Các thao tác cơ bản

co
• Cây nhị phân (binary tree)

an
– Khái niệm
th
ng
– Phân loại
o

• Các trường hợp đặc biệt


du

– Cây suy biến (degenerate binary tree)


u
cu

– Cây đầy đủ (full binary tree)


– Cây hoàn chỉnh (complete binary tree)

Bộ Môn ĐT-KTMT - Viện ĐT-VT. Chương 11: Cấu trúc cây 2


CuuDuongThanCong.com https://fb.com/tailieudientucntt
Nội dung
• Một số tính chất của cây nhị phân

om
• Cài đặt cây nhị phân

.c
– Dùng cấu trúc lưu trữ móc nối

ng
– Dùng cấu trúc lưu trữ tuần tự

co
• Duyệt cây nhị phân

an
– Phép thăm và duyệt
– Các phép duyệt cây th
o ng
• Duyệt theo thứ tự trước
du

• Duyệt theo thứ tự giữa


u

• Duyệt theo thứ tự sau


cu

• Duyệt theo từng mức (tầng)


– Một số ứng dụng của cấu trúc cây nhị phân

Bộ Môn ĐT-KTMT - Viện ĐT-VT. Chương 11: Cấu trúc cây 3


CuuDuongThanCong.com https://fb.com/tailieudientucntt
Các khái niệm cơ bản
• Mô tả cấu trúc cây (tree) list head
– Các phần tử hay các nút

om
• nút (node)

.c
• gốc (root)

ng
– Các quan hệ phân cấp giữa các cặp nút.

co
tail
• nhánh

an
root
• quan hệ cha-con tree

th
• quan hệ cấp trên-cấp dưới
ng
nodes
– Cây rỗng
o
du

parent
u
cu

child

Leaves (childless
nodes)
Bộ Môn ĐT-KTMT - Viện ĐT-VT. Chương 11: Cấu trúc cây 4
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Các khái niệm cơ bản
• Giới thiệu chung – Ví dụ
– Ví dụ về các tiêu đề

om
– Ví dụ thư mục trong windows

.c
ng
4

co
C Users

an
Windows

Temp
th
o ng
Program Files 4.1
du

4.2
u
cu

4.1.1 4.1.2 4.1.3 4.2.1 4.2.2

Bộ Môn ĐT-KTMT - Viện ĐT-VT. Chương 11: Cấu trúc cây 5


CuuDuongThanCong.com https://fb.com/tailieudientucntt
Các khái niệm cơ bản
• Giới thiệu chung – Khái niệm
– Kích thước cây (size): là số nút có trên cây S(T)

om
– Cấp của một nút (degree): là số con mà nút này có d(A)

.c
– Cấp của cây: d(T)

ng
• là cấp của nút có số con nhiều nhất trên cây 1

co
– Nút nhánh (node-branch node)

an
• là nút có ít nhất một con

th
• tên gọi khác: nút trong, nút không tận cùng
ng 2 7
– Nút lá (leaf node or terminal node)
o
• là nút không có con nào
du

• tên gọi khác: nút ngoài, nút tận cùng 3 4 5 6


u
cu

– Mức của một nút (level): L(A)


• Nếu A là nút gốc thì L(A) = 1 8
• Nếu B là cha của A thì L(A) = L(B) +1

Bộ Môn ĐT-KTMT - Viện ĐT-VT. Chương 11: Cấu trúc cây 6


CuuDuongThanCong.com https://fb.com/tailieudientucntt
Các khái niệm cơ bản
• Giới thiệu chung – Khái niệm 1

– Chiều cao của một nút (height) –

om
Độ sâu (degree)
2

.c
• h(A) = L(A)-1 7

ng
– Chiều cao của cây: h(T)

co
• là chiều cao của nút cao nhất trong cây
3 4 5 6
– Đường đi giữa nút gốc và một nút khác

an
th
(path): p(A)
• là dãy các nhánh nối từ gốc đến nút đó 8
ng
– Độ dài đường đi (path length): PL(A)
o
du

• là tổng độ dài các nhánh tạo thành đường đi


u

• Thực tế: nhánh thường là khái niệm logic biểu diễn quan hệ phân cấp giữa
cu

một cặp nút, nên không có độ dài. Vì vậy, thường quy ước độ dài của tất
cả các nhánh trong một cây đều bằng 1 (đơn vị). Khi đó, độ dài đường đi
tương đương với chiều cao

Bộ Môn ĐT-KTMT - Viện ĐT-VT. Chương 11: Cấu trúc cây 7


CuuDuongThanCong.com https://fb.com/tailieudientucntt
Các khái niệm cơ bản
• Giới thiệu chung – Khái niệm
– Cây con

om
– Cây được sắp (có thứ tự - ordered tree)

.c
• Có thứ tự (ordered tree): có trật tự tuyến tính

ng
giữa các nút con

co
• Không có thứ tự (unordered tree): không có trật 1

an
tự tuyến tính

th
– Rừng (forest) ng
• là cấu trúc bao gồm nhiều cây 2 7
o
du

• có thể có rừng rỗng


u
cu

3 4 5 6

8
Bộ Môn ĐT-KTMT - Viện ĐT-VT. Chương 11: Cấu trúc cây 8
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Các khái niệm cơ bản
• Giới thiệu chung – Các tính chất cơ bản
1
– Số nút của cây bằng số nhánh cộng 1

om
– Cây có tính chất đệ quy. Tính chất này sẽ

.c
được sử dụng trong nhiều thao tác sau này. 2

ng
7
– Cây là một cấu trúc dữ liệu động, tức là

co
kích thước của nó (số nút của cây) có thể

an
thay đổi. 3 4 5 6

th
– Cấu trúc cây không còn cấu trúc tuyến tính
ng
nữa mà là cấu trúc phân cấp. 8
o
du

– Chỉ tồn tại duy nhất một đường đi từ gốc


u

đến một nút khác.


cu

Bộ Môn ĐT-KTMT - Viện ĐT-VT. Chương 11: Cấu trúc cây 9


CuuDuongThanCong.com https://fb.com/tailieudientucntt
Các khái niệm cơ bản
• Giới thiệu chung – Các thao tác cơ bản trên cây
– Khởi tạo: chuẩn bị CTLT để lưu trữ cấu trúc cây

om
– Bổ sung một nút mới vào cây 1

.c
• Xác định vị trí

ng
• Xác định quan hệ nút mới và nút tại vị trí bổ sung

co
– Lấy ra một nút 2 7

an
• Xác định vị trí

th
• Cấu trúc lại cây ng
– Tìm cha mỗi đỉnh 3 4 5 6
o
• Parent(x)
du

– Tìm con bên trái ngoài cùng (con trưởng) của mỗi đỉnh 8
u

• EldestChild(x)
cu

– Tìm em liền kề mỗi đỉnh


• NextSibling(x)

Bộ Môn ĐT-KTMT - Viện ĐT-VT. Chương 11: Cấu trúc cây 10


CuuDuongThanCong.com https://fb.com/tailieudientucntt
Các khái niệm cơ bản
• Giới thiệu chung – Các thao tác cơ bản trên cây
– Duyệt cây

om
• Preorder: 1, 2, 4, 3, 5, 7, 6, 8, 9

.c
a

ng
=> a, b, c, d

co
b c d 1

an
• Inorder: 4, 2, 3, 5, 1, 8, 6, 7, 9 : Thường chỉ dùng

th
với cây NP
2
ng
b 7
o
=> a, b, c, d
du

a c d
u

• Postorder: 4, 3, 5, 2, 8, 6, 9, 7, 1 4 3 5 6 9
cu

d
=> a, b, c, d 8
a b c

Bộ Môn ĐT-KTMT - Viện ĐT-VT. Chương 11: Cấu trúc cây 11


CuuDuongThanCong.com https://fb.com/tailieudientucntt
Các khái niệm cơ bản
• Giới thiệu chung – Các thao tác cơ bản trên cây
– Ghép cây

om
• MergeTree(T1,T2,x): x=1

.c
• Vai trò của x: nút ghép, gốc của T2 sẽ là con của x, và ta có thể ghép

ng
trái, ghép phải

co
– Cắt cây
1

an
• CutTree(T1,x,T2): x=2

th
1
2
ng
2 7
o
du

7
u

3 4 5
cu

6 3 4 5 6
T2 T1

8 8
Bộ Môn ĐT-KTMT - Viện ĐT-VT. Chương 11: Cấu trúc cây 12
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Cây nhị phân (binary tree)
• Mô tả cây nhị phân và các khái niệm cơ bản
– Cây có thứ tự và là cây cấp hai, tức là mỗi nút có tối đa 2 con.

om
– Hai con của một nút được phân biệt thứ tự và quy ước nút

.c
trước gọi là nút con trái và nút sau được gọi là nút con phải

ng
co
– Khi biểu diễn cây nhị phân, ta cũng 1
cần có sự phân biệt rõ ràng giữa

an
con trái và con phải, nhất là khi nút
chỉ có một con. th
ng
2 3
o
du
u
cu

4 5 6 7

8
Bộ Môn ĐT-KTMT - Viện ĐT-VT. Chương 11: Cấu trúc cây 13
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Cây nhị phân (binary tree)
• Mô tả cây nhị phân và các khái niệm cơ bản
– Loại nút:

om
• Nút có đủ hai con được gọi là nút kép: 2, 3

.c
• Nút chỉ có một con gọi là nút đơn: 7

ng
• Nút không có con được gọi là nút lá: 4, 5, 6, 8

co
1
– Cây con có gốc là nút con trái/phải được Phải

an
gọi là cây con trái/phải. (Right)

th
ng Trái
(Left) 2 3
o
du
u
cu

4 5 6 7

8
Bộ Môn ĐT-KTMT - Viện ĐT-VT. Chương 11: Cấu trúc cây 14
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Cây nhị phân (binary tree)
• Các thao tác cơ bản
– Cây nhị phân cũng có các thao tác cơ bản tương tự như của cây

om
tổng quát.:

.c
• Khởi tạo: chuẩn bị CTLT để lưu trữ cấu trúc cây

ng
• Bổ sung một nút mới vào cây

co
• Lấy ra một nút

an
• Tìm cha mỗi đỉnh: Parent(x)

th
• Tìm con bên trái của mỗi đỉnh: LeftChild(x)
ng
• Tìm con bên phải của mỗi đỉnh: RightChild(x)
o
• Ghép cây
du

• Cắt cây
u

• Duyệt cây
cu

Bộ Môn ĐT-KTMT - Viện ĐT-VT. Chương 11: Cấu trúc cây 15


CuuDuongThanCong.com https://fb.com/tailieudientucntt
Cây NP - Các trường hợp đặc biệt
• Cây suy biến (degenerate binary tree)
– Là cây nhị phân mà mỗi nút chỉ có tối đa một con. Nó đã bị suy

om
biến về cấu trúc danh sách.

.c
– Như vậy, danh sách chỉ là dạng suy biến, trường hợp đặc biệt

ng
của cấu trúc cây, và nó vẫn giữa được tính chất đệ quy của cây

co
an
1 1 1

th
ng
2
o
2 2
du
u
cu

3
3 3

4
Bộ Môn ĐT-KTMT - Viện ĐT-VT. Chương 11: Cấu trúc cây 16
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Cây NP - Các trường hợp đặc biệt
• Cây đầy đủ (full binary tree)

om
– Là cây nhị phân có số nút tối đa ở tất cả các mức. Tức là ở mức
i sẽ có đúng 2i-1 nút. Do đó, nếu cây nhị phân có chiều cao h thì

.c
kích thước của nó là: S(T) = 20+21+…+2h = 2h+1-1 ;

ng
co
1 1

an
th
ng
2 3 2 3
o
du
u
cu

4 5 6 7

Bộ Môn ĐT-KTMT - Viện ĐT-VT. Chương 11: Cấu trúc cây 17


CuuDuongThanCong.com https://fb.com/tailieudientucntt
Cây NP - Các trường hợp đặc biệt
• Cây hoàn chỉnh (complete binary tree)
– Gọi h là chiều cao của cây T. Ta gọi nó là cây hoàn chỉnh nếu:

om
• T là cây đầy đủ đến chiều cao h-1

.c
• Các nút có chiều cao h thì dồn hết về bên trái.

ng
co
1

an
th
ng
2 3
o
du
u

7
cu

4 5 6

8 9 10

Bộ Môn ĐT-KTMT - Viện ĐT-VT. Chương 11: Cấu trúc cây 18


CuuDuongThanCong.com https://fb.com/tailieudientucntt
Một số tính chất của cây nhị phân
• Một số tính chất của cây nhị phân
– Tính đệ quy: nếu ta chặt một nhánh bất kì của cây nhị phân thì

om
ta sẽ thu được hai cây con cũng đều là cây nhị phân.

.c
– Gọi h và n lần lượt là chiều cao và kích thước của cây nhị phân

ng
co
thì ta luôn có: log2(n+1) ≤ h+1 ≤ n 1

an
th
1 1
ng
2 3
o
du

2 2
u

3 7
cu

4 5 6

3 4 5 6 7 8 9 10

Bộ Môn ĐT-KTMT - Viện ĐT-VT. Chương 11: Cấu trúc cây 19


CuuDuongThanCong.com https://fb.com/tailieudientucntt
Một số tính chất của cây nhị phân
• Một số tính chất của cây nhị phân
– Đối với cây hoàn chỉnh và cây đầy đủ: nếu ta đánh số các nút

om
lần lượt từ 1..N, với N là kích thước của cây theo thứ tự như

.c
hình vẽ thì ta có nhận xét sau:

ng
– Tại nút có số thứ tự i: 1

co
• nếu 2i>N: nút i là nút lá

an
• nếu 2i=N: nút i là nút đơn

th
2 3
• nếu 2i<N: nút i là nút kép và
ng
có hai con trái, phải tương ứng là 2i và 2i+1
o
du

– Tại nút có số thứ tự j:


4 5 6 7
u

• nếu j=1: nút j là nút gốc (không có nút cha)


cu

• nếu j>1: nút


j/2 (nếu j chẵn) hoặc 8 9 10
(j-1)/2 (nếu j lẻ) là nút cha của nút j.

Bộ Môn ĐT-KTMT - Viện ĐT-VT. Chương 11: Cấu trúc cây 20


CuuDuongThanCong.com https://fb.com/tailieudientucntt
Cây nhị phân (binary tree)
• Các thao tác cơ bản - Giải thuật duyệt cây
– Phép duyệt cây

om
• Phép thăm một nút (visit): là thao tác truy nhập vào một nút

.c
của cây để xử lý nút đó.

ng
• Phép duyệt (traversal): là phép thăm một cách hệ thống tất

co
cả các nút của cây, mỗi nút đúng một lần.

an
th
o ng
du
u
cu

Bộ Môn ĐT-KTMT - Viện ĐT-VT. Chương 11: Cấu trúc cây 21


CuuDuongThanCong.com https://fb.com/tailieudientucntt
Cây nhị phân (binary tree)
• Các thao tác cơ bản - Giải thuật duyệt cây
– Hướng thứ nhất: dựa vào tính chất đệ quy của cây để phát triển

om
các giải thuật đệ quy để duyệt cây.

.c
• Cây nhị phân T bất kỳ được hình thành từ ba thành phần: gốc, cây con
trái của T và cây con phải của T. Cả ba thành phần này đều là cây nhị

ng
phân. Theo hướng này, ta có 3 giải thuật duyệt cây như sau:

co
– Duyệt theo thứ tự trước (preorder traversal)

an
– Duyệt theo thứ tự giữa (inorder traversal)

th
– Duyệt theo thứ tự sau (postorder traversal)
– Duyệt theo từng mức (tầng) - Duyệt theo chiều rộng
ng
– Hướng thứ hai:
o
du

• Chuyển cấu trúc cây về cấu trúc danh sách. Sau đó đưa bài toán duyệt
cây về bài toán duyệt danh sách đơn giản hơn nhiều.
u
cu

• Theo hướng này, chúng ta sẽ sử dụng một danh sách để lưu các nút của
cây, sau đó sẽ duyệt danh sách.
• Tuỳ theo loại danh sách (hàng đợi, ngăn xếp,…) và thứ tự duyệt trong
danh sách mà chúng ta có những cách duyệt cây khác nhau.
Bộ Môn ĐT-KTMT - Viện ĐT-VT. Chương 11: Cấu trúc cây 22
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Cây nhị phân (binary tree)
• Các thao tác cơ bản - Giải thuật duyệt cây
– Giải thuật duyệt theo thứ tự trước (preorder traversal, còn gọi

om
là duyệt cây theo chiều sâu): đây là giải thuật đệ quy

.c
• Trường hợp đệ quy: để duyệt cây nhị phân T, ta theo các bước sau:

ng
– Thăm gốc

co
T 1
– Duyệt cây con trái theo thứ tự trước

an
– Duyệt cây con phải theo thứ tự trước

th
• Trường hợp điểm dừng:
ng
2 3
– Khi cây T rỗng.
o
du

VD: 1, 2, 4, 8, 9, 5, 10, 3, 6, 7
u

7
cu

4 5 6

8 9 10

Bộ Môn ĐT-KTMT - Viện ĐT-VT. Chương 11: Cấu trúc cây 23


CuuDuongThanCong.com https://fb.com/tailieudientucntt
Cây nhị phân (binary tree)
• Các thao tác cơ bản - Giải thuật duyệt cây
– Giải thuật duyệt theo thứ tự giữa (inorder travelsal): đây là giải

om
thuật đệ quy.

.c
• Trường hợp đệ quy: để duyệt cây nhị phân T, ta theo các bước sau:

ng
– Duyệt cây con trái theo thứ tự giữa

co
1
– Thăm gốc

an
– Duyệt cây con phải theo thứ tự giữa

th
• Trường hợp điểm dừng: ng
– Khi cây T rỗng. 2 3
o
du

VD: 8, 4, 9, 2, 10, 5, 1, 6, 3, 7
u

7
cu

4 5 6

8 9 10

Bộ Môn ĐT-KTMT - Viện ĐT-VT. Chương 11: Cấu trúc cây 24


CuuDuongThanCong.com https://fb.com/tailieudientucntt
Cây nhị phân (binary tree)
• Các thao tác cơ bản - Giải thuật duyệt cây
– Giải thuật duyệt theo thứ tự sau (postorder travelsal): đây là

om
giải thuật đệ quy.

.c
• Trường hợp đệ quy: để duyệt cây nhị phân T, ta theo các bước sau:

ng
– Duyệt cây con trái theo thứ tự sau

co
1
– Duyệt cây con phải theo thứ tự sau

an
– Thăm gốc

th
• Trường hợp điểm dừng: ng
– Khi cây T rỗng. 2 3
o
• VD: 8, 9, 4, 10, 5, 2, 6, 7, 3, 1
du
u

7
cu

4 5 6

8 9 10

Bộ Môn ĐT-KTMT - Viện ĐT-VT. Chương 11: Cấu trúc cây 25


CuuDuongThanCong.com https://fb.com/tailieudientucntt
Cây nhị phân (binary tree)
• Các thao tác cơ bản - Giải thuật duyệt cây
– Giải thuật duyệt cây theo từng mức (theo chiều rộng): giải

om
thuật không đệ quy:

.c
• Đưa bài toán duyệt cây về duyệt danh sách.

ng
• Để thứ tự duyệt là theo từng mức (từng tầng) và sử dụng một cấu trúc

co
danh sách kiểu hàng đợi Q.

an
// Khởi tạo: Q= .
th
Initialize (Q)
InsertQ (T, Q); //Bổ sung nút gốc vào Q
ng
While ( Q <> ) do
o
du

P = DeleteQ (Q); //Lấy một nút ra khỏi Q để chuẩn bị thăm


Visit (P); //Thăm P
u
cu

if <P có con trái PL> then InsertQ (PL, Q);


if <P có con phải PR> then InsertQ (PR, Q);
End While ;

Bộ Môn ĐT-KTMT - Viện ĐT-VT. Chương 11: Cấu trúc cây 26


CuuDuongThanCong.com https://fb.com/tailieudientucntt
Cây nhị phân (binary tree)
• Các thao tác cơ bản - Giải thuật duyệt cây
– Giải thuật duyệt cây theo từng mức (theo chiều rộng): giải

om
thuật không đệ quy

.c
VD:

ng
• Thứ tự đưa vào hàng: 1 | 2 3 | 4 5 | 6 7 | 8 9 | 10 |

co
1

an
• Thứ tự thăm: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10

th
ng
2 3
o
du
u

7
cu

4 5 6

8 9 10

Bộ Môn ĐT-KTMT - Viện ĐT-VT. Chương 11: Cấu trúc cây 27


CuuDuongThanCong.com https://fb.com/tailieudientucntt
Cài đặt cây nhị phân
• Có thể sử dụng hai loại CTLT để cài đặt cây
– Sử dụng CTLT tuần tự:

om
• Thường chỉ thích hợp khi cài đặt các cây NP đặc biệt.

.c
• Đối với cây thông thường, ta phải bổ sung thêm các nút để nó trở thành

ng
đặc biệt (thành cây đầy đủ hoặc hoàn chỉnh). Do đó, làm cho việc cài

co
đặt phức tạp và tốn bộ nhớ, nên ít khi được sử dụng.

an
• Thường chỉ áp dụng khi hệ thống không cung cấp CTLT móc nối.

th
– Sử dụng CTLT móc nối: ng
• Đây là cách thường được dùng do tính linh hoạt của CTLT móc nối, rất
o
thích hợp để cài đặt các CTDL phi tuyến.
du

• Do đó, trong phần tiếp theo ta chỉ xét phương pháp cài đặt này.
u
cu

Bộ Môn ĐT-KTMT - Viện ĐT-VT. Chương 11: Cấu trúc cây 28


CuuDuongThanCong.com https://fb.com/tailieudientucntt
Cài đặt cây nhị phân
• Nguyên tắc cài đặt: Sử dụng cấu trúc lưu trữ móc nối
– Đối với cây nhị phân, ta cần lưu trữ hai thành phần:

om
– Các phần tử (nút) của cấu trúc cây:

.c
• Dùng các nút của CTLT để lưu trữ các phần tử.

ng
– Các nhánh (quan hệ cha-con) giữa các cặp nút:

co
• Sử dụng con trỏ để biểu diễn các nhánh.

an
th
• Do mỗi nút có nhiều nhất hai con nên trong mỗi nút của CTLT ta sẽ có
hai con trỏ để trỏ đến tối đa hai con này.
o ng
du
u
cu

Bộ Môn ĐT-KTMT - Viện ĐT-VT. Chương 11: Cấu trúc cây 29


CuuDuongThanCong.com https://fb.com/tailieudientucntt
Cài đặt cây nhị phân
• Dùng cấu trúc móc nối
– Cấu tạo mỗi nút (xem hình):

om
• Trường Info: chứa thông tin về một phần tử.

.c
• Trường LP và RP tương ứng là hai con trỏ sẽ trỏ vào hai nút con trái và

ng
con phải.

co
• Nếu không có con thì giá trị con trỏ tương ứng sẽ rỗng (NIL/NULL)

an
• Khai báo cấu trúc một nút:

th
ng
struct Node { LP Info RP
o
type Info;
du

Node * LP, *RP;


u

};
cu

typedef Node* PNode;

Bộ Môn ĐT-KTMT - Viện ĐT-VT. Chương 11: Cấu trúc cây 30


CuuDuongThanCong.com https://fb.com/tailieudientucntt
Cài đặt cây nhị phân
• Dùng cấu trúc móc nối
– Tổ chức cấu trúc cây như sau (xem hình):

om
• Ít nhất một con trỏ T trỏ vào nút gốc, vừa đại diện cho cây, vừa

.c
là điểm truy nhập vào các nút khác trong cây. T

ng
• Các thao tác muốn truy nhập vào các nút
1

co
trong cây phải thông qua con trỏ này.
• Nhận xét: với cách tổ chức này, khi kích

an
thước cây là N thì sẽ có N+1 con trỏ rỗng. 2 3

th
• Khai báo cấu trúc cây: có 2 cách,
ng
sau này để đơn giản ta sẽ dùng cách 1 4 5 6
o
du

Cách 1: typedef PNode BinaryTree;


Cách 2: struct BinaryTree {
u
cu

PNode T; //con trỏ trỏ vào nút gốc


int n; // kích thước cây
}

Bộ Môn ĐT-KTMT - Viện ĐT-VT. Chương 11: Cấu trúc cây 31


CuuDuongThanCong.com https://fb.com/tailieudientucntt
Cài đặt cây nhị phân
• Dùng cấu trúc móc nối - Cài đặt một số thao tác cơ bản
– Thao tác khởi tạo: tạo ra một cây rỗng.

om
.c
void InitBT (BinaryTree T) {
T
T = NULL;

ng
} 1

co
an
2 3

th
ng
4 5 6
o
du
u
cu

Bộ Môn ĐT-KTMT - Viện ĐT-VT. Chương 11: Cấu trúc cây 32


CuuDuongThanCong.com https://fb.com/tailieudientucntt
Duyệt cây nhị phân
• Dùng cấu trúc móc nối - Cài đặt một số thao tác cơ bản
– Duyệt cây theo thứ tự trước (preorder traversal)

om
.c
{Duyệt cây theo thứ tự trước}
void PreOrderTraversal (BinaryTree T) {

ng
if (T==NULL) return;

co
Visit(T);

an
PreOrderTraversal(T->LP);

th
PreOrderTraversal(T->RP);
}
ng
T
o
du

1
u
cu

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

4 5 6

Bộ Môn ĐT-KTMT - Viện ĐT-VT. Chương 11: Cấu trúc cây 33


CuuDuongThanCong.com https://fb.com/tailieudientucntt
Duyệt cây nhị phân
• Dùng cấu trúc móc nối - Cài đặt một số thao tác cơ bản
– Duyệt cây theo thứ tự giữa (inorder traversal)

om
.c
{Duyệt cây theo thứ tự giữa}
void InOrderTraversal (BinaryTree T) {

ng
if (T==NULL) return;

co
InOrderTraversal(T->LP);

an
Visit(T);

th
InOrderTraversal(T->RP);
}
ng
T
o
du

1
u
cu

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

4 5 6

Bộ Môn ĐT-KTMT - Viện ĐT-VT. Chương 11: Cấu trúc cây 34


CuuDuongThanCong.com https://fb.com/tailieudientucntt
Duyệt cây nhị phân
• Dùng cấu trúc móc nối - Cài đặt một số thao tác cơ bản
– Duyệt cây theo thứ tự sau (postorder travelsal)

om
.c
{Duyệt cây theo thứ tự sau}
void PostOrderTraversal (BinaryTree T) {

ng
if (T==NULL) return;

co
PostOrderTraversal(T->LP);

an
PostOrderTraversal(T->RP);

th
Visit(T);
}
ng
T
o
du

1
u
cu

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

4 5 6

Bộ Môn ĐT-KTMT - Viện ĐT-VT. Chương 11: Cấu trúc cây 35


CuuDuongThanCong.com https://fb.com/tailieudientucntt
Cây nhị phân tìm kiếm
• Giới thiệu

om
– Mục đích: ứng dụng vào lưu trữ và tìm kiếm thông tin một các
hiệu quả nhất

.c
– Nguyên tắc: lưu trữ và tìm kiếm thông qua "khoá"

ng
co
• Nhóm thuộc tính khoá: bao gồm các thuộc tính, tính chất giúp chúng ta
hoàn toàn xác định được đối tượng

an
th
o ng
du
u
cu

Bộ Môn ĐT-KTMT - Viện ĐT-VT. Chương 11: Cấu trúc cây 36


CuuDuongThanCong.com https://fb.com/tailieudientucntt
Cây nhị phân tìm kiếm
• Là cây nhị phân thỏa mãn các điều kiện sau
– Khoá của các đỉnh thuộc cây con trái nhỏ hơn khoá của gốc

om
– Khóa của gốc nhỏ hơn khoá của các đỉnh thuộc cây con phải

.c
– Cây con trái và cây con phải cũng là cây nhị phân tìm kiếm

ng
co
an
root

th
BSearchTree = BinaryTree; and ng
Key(LChild) < Key(root); and
Key(root) < Key(RChild); LChild RChild
o
du

AND
u
cu

LTree = BSearchTree; and


RTree = BSearchTree;
LTree
RTree

Bộ Môn ĐT-KTMT - Viện ĐT-VT. Chương 11: Cấu trúc cây 37


CuuDuongThanCong.com https://fb.com/tailieudientucntt
Cây nhị phân tìm kiếm
• Khai báo cấu trúc nút

om
struct Node {

.c
keytype Key; //Thường là kiểu có thứ tự, có thể so sánh được

ng
Node * LP, *RP;
};

co
an
typedef Node* PNode;

th
typedef PNode BinaryTree; ng
typedef BinaryTree BSearchTree;
o
du
u
cu

Bộ Môn ĐT-KTMT - Viện ĐT-VT. Chương 11: Cấu trúc cây 38


CuuDuongThanCong.com https://fb.com/tailieudientucntt
Cây nhị phân tìm kiếm
• Khai báo cấu trúc cây
– Ví dụ:

om
T T

.c
1 4

ng
co
2 3 2 6

an
th
4 5 6
ng 1 3 5
o
Cây nhị phân Cây nhị phân tìm kiếm
du
u
cu

Bộ Môn ĐT-KTMT - Viện ĐT-VT. Chương 11: Cấu trúc cây 39


CuuDuongThanCong.com https://fb.com/tailieudientucntt
Cây nhị phân tìm kiếm
• Cài đặt các thao tác cơ bản: Tìm một nút có giá trị x cho
trước. Hàm sẽ trả về con trỏ trỏ vào nút tìm được nếu có, trái lại

om
trả về con trỏ NULL

.c
ng
PNode SearchT (BSearchTree Root, keytype x){

co
if (Root==NULL) return NULL;

an
if (x == Root->Key) return Root;
else if (x < Root->Key) return SearchT (Root->LP, x);

th
else return SearchT (Root->RP, x);
ng
}
o
du
u
cu

Bộ Môn ĐT-KTMT - Viện ĐT-VT. Chương 11: Cấu trúc cây 40


CuuDuongThanCong.com https://fb.com/tailieudientucntt
Cây nhị phân tìm kiếm
• Cài đặt các thao tác cơ bản: Bổ sung một nút
– Minh họa:

om
.c
T

ng
co
T 4 RP
LP
x <>4 ?

an
4

th
ng 2 6
2 6
o
du

1 3 5
u
cu

LT
RT

Bộ Môn ĐT-KTMT - Viện ĐT-VT. Chương 11: Cấu trúc cây 41


CuuDuongThanCong.com https://fb.com/tailieudientucntt
Cây nhị phân tìm kiếm
• Cài đặt các thao tác cơ bản: Bổ sung một nút

om
void InsertT (BSearchTree & Root, keytype x){

.c
PNode Q;
if (Root==NULL) { //khi cây rỗng

ng
Q = new Node; //tạo ra đỉnh mới

co
Q->Key = x;

an
Q->LP =Q->RP = NULL;

th
Root = Q;
}
ng
else {
o
du

if (x < Root->Key) InsertT (Root->LP, x);


else if (x > Root->Key) InsertT (Root->RP, x);
u
cu

}
}

Bộ Môn ĐT-KTMT - Viện ĐT-VT. Chương 11: Cấu trúc cây 42


CuuDuongThanCong.com https://fb.com/tailieudientucntt
Cây nhị phân tìm kiếm
• Cài đặt các thao tác cơ bản: Lấy ra một nút
Ý tưởng

om
– Tìm đến nút có giá trị khóa cần loại bỏ

.c
– Thực hiện phép loại bỏ nút đó

ng
– Thực hiện xắp xếp lại để đảm bảo tính chất cây tìm kiếm NP

co
• Nếu đỉnh cần loại bỏ là lá => không cần làm gì

an
• Nếu đỉnh cần loại bỏ chỉ có 1 cây con => thực hiện phép nối

th
• Nếu đỉnh cần loại bỏ có hai cây con LTree, RTree => cần thay khoá của
đỉnh hai cây con này bằng giá trị Max(LTree) hoặc Min(RTree)
ng
– Lưu ý:
o
du

• Giá trị Max(LTree) cần tìm ở phần tử bên phải ngoài cùng của cây con
Ltree: luôn đi theo bên phải của cây đến khi không được nữa
u
cu

Q->RP=NULL thì đó là nút ngoài cùng bên phải


• Giá trị Min(RTree) cần tìm ở phần tử bên trái ngoài cùng của cây con
Rtree: luôn đi theo bên trái của cây đến khi không được nữa
Q->LP=NULL thì đó là nút ngoài cùng bên trái

Bộ Môn ĐT-KTMT - Viện ĐT-VT. Chương 11: Cấu trúc cây 43


CuuDuongThanCong.com https://fb.com/tailieudientucntt
Cây nhị phân tìm kiếm
• Cài đặt các thao tác cơ bản: Lấy ra một nút
– Minh họa:

om
Xóa nút lá Xóa nút chỉ có 1 cây con

.c
Xóa nút có 2 cây con
4 4 4

ng
co
x=9

an
2 9 2 9 2 or 9

th
ng
8 11 8 11 8 11 or
o
du

x=8
u
cu

6 10 6 10 6 10
x=10

5 7 5 7 5 7

Bộ Môn ĐT-KTMT - Viện ĐT-VT. Chương 11: Cấu trúc cây 44


CuuDuongThanCong.com https://fb.com/tailieudientucntt
Cây nhị phân tìm kiếm
• Cài đặt các thao tác cơ bản: Lấy ra một nút

om
void DeleteT (BSearchTree & Root, keytype x){
if (Root != NULL) {

.c
if (x < Root->Key) DeleteT (Root->LP, x);

ng
else if (x > Root->key) DeleteT (Root->RP, x);
else DelNode (Root); //Xoá gốc của cây

co
}

an
}

th
ng
void DelNode (PNode & P) { //Xóa giá trị ở nút P & sắp lại cây
o
PNode Q, R;
du

if (P->LP == NULL) { //Xóa nút chỉ có cây con phải


u

Q = P;
cu

P = P->RP;
} else if (P->RP = NULL) //Xóa nút chỉ có cây con trái
{

Bộ Môn ĐT-KTMT - Viện ĐT-VT. Chương 11: Cấu trúc cây 45


CuuDuongThanCong.com https://fb.com/tailieudientucntt
Cây nhị phân tìm kiếm
• Cài đặt các thao tác cơ bản: xoá một nút (tiếp...)
Q = P;

om
P = P->LP;
} else { //Xóa nút có 2 cây con

.c
[Tìm giá trị Max ở
Q = P->LP;

ng
if (Q->RP == NULL) {
cây con trái. Nó luôn

co
P->Key = Q->Key;
là giá trị ở nút ngoài
P->LP = Q->LP;
cùng bên phải cây

an
} else {
con => giải thuật:

th
do { //Dùng R để lưu parent của Q
Luôn đi theo bên R = Q;
ng
phải của Q, khi nào Q = Q->RP;
o
không đi đươc nữa } while (Q->RP != NULL);
du

Q->RP = NULL thì P->Key = Q->Key; //Lấy giá trị ở Q đưa lên
u

đó là nút ngoài cùng R->RP = Q->LP; //Chuyển con của Q lên vị trí Q
cu

bên phải] }
}
delete Q; //Xoá Q
}
Bộ Môn ĐT-KTMT - Viện ĐT-VT. Chương 11: Cấu trúc cây 46
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Cây tổng quát
• Giới thiệu
– Cây tổng quát là cây mà mỗi nút có thể có nhiều hơn hai con.

om
Nói chung, cây càng có nhiều con thì việc cài đặt càng phức

.c
tạp, nhất là những cây mà số con tối đa thường không cố định

ng
(VD: cây gia phả, cây thư mục).

co
4

an
C Users

th
ng
Windows
o
du

Temp 4.1 4.2


u

Program Files
cu

4.1.1 4.1.2 4.1.3 4.2.1 4.2.2

Bộ Môn ĐT-KTMT - Viện ĐT-VT. Chương 11: Cấu trúc cây 47


CuuDuongThanCong.com https://fb.com/tailieudientucntt
Cây tổng quát
• Các phương pháp cài đặt
– Cài đặt trực tiếp sử dụng CTLT móc nối

om
– Cài đặt gián tiếp qua cây nhị phân

.c
ng
co
an
th
o ng
du
u
cu

Bộ Môn ĐT-KTMT - Viện ĐT-VT. Chương 11: Cấu trúc cây 48


CuuDuongThanCong.com https://fb.com/tailieudientucntt
Cây tổng quát
• Cài đặt trực tiếp sử dụng CTLT móc nối
Ý tưởng:

om
– Tương tự khi cài đặt cây NP

.c
– Chỉ thích hợp khi ta biết trước cấp của cây (số con tối đa của

ng
một nút) và thường là số cấp không lớn (4-5).

co
– Khi số cấp của cây lớn thì cách cài đặt này sẽ không hiệu quả

an
do tốn khá nhiều bộ nhớ để lưu các con trỏ rỗng.
th
ng
– Nguyên tắc cài đặt cụ thể: nếu gọi cấp của cây là d, thì cấu tạo
o
một nút gồm 2 phần:
du

• Phần Info chứa nội dung thông tin của nút


u

• Phần móc nối sẽ có d con trỏ p1, p2,…pd để trỏ đến tối đa d con của nút.
cu

Bộ Môn ĐT-KTMT - Viện ĐT-VT. Chương 11: Cấu trúc cây 49


CuuDuongThanCong.com https://fb.com/tailieudientucntt
Cây tổng quát
• Cài đặt trực tiếp sử dụng CTLT móc nối
– Tổ chức cấu trúc cây

om
• Vẫn có một con trỏ T trỏ vào nút gốc của cây.

.c
• N là kích thước của cây => số con trỏ rỗng trong cây T là: N(d-1) + 1.

ng
• Khi d càng lớn thì số con trỏ rỗng trong cây sẽ càng nhiều, lớn hơn số

co
nút của cây nhiều lần => lãng phí bộ nhớ rất lớn.

an
• Hơn nữa, cách cài đặt này đòi hỏi chúng ta phải biết trước số con lớn

th
nhất có trong một nút của cây. Điều này không phải lúc nào cũng có
được trong các cây trong thực tế.
o ng
du
u
cu

Bộ Môn ĐT-KTMT - Viện ĐT-VT. Chương 11: Cấu trúc cây 50


CuuDuongThanCong.com https://fb.com/tailieudientucntt
Cây tổng quát
• Cài đặt gián tiếp qua cây nhị phân
Ý tưởng:

om
– Tận dụng các kết quả cài đặt từ cây NP, đồng thời khắc phục

.c
các hạn chế của cách cài đặt trực tiếp.

ng
– Chuyển cây tổng quát về cây NP.

co
– Cài đặt gián tiếp thông qua cài đặt cây NP. Muốn như vậy, ta

an
phải xác định một quy tắc chuyển đổi hai chiều kiểu song ánh
th
từ cây tổng quát sang cây NP và ngược lại.
o ng
– Quy tắc:
du

• Coi cây tổng quát là cây có thứ tự. Nếu cây tổng quát không có thứ tự
u

thì ta đưa thêm vào một thứ tự trong cây đó.


cu

• Chuyển nút con trái nhất (con cả) của một nút thành nút con trái của nó
• Chuyển nút em kế cận của một nút thành nút con phải của nút đó.

Bộ Môn ĐT-KTMT - Viện ĐT-VT. Chương 11: Cấu trúc cây 51


CuuDuongThanCong.com https://fb.com/tailieudientucntt
Cây tổng quát
– Ví dụ

om
1 1

.c
ng
co
2 3 4 2

an
th
o ng
5 6 8 9 5 3
du
u

6 4
cu

Bộ Môn ĐT-KTMT - Viện ĐT-VT. Chương 11: Cấu trúc cây 52


CuuDuongThanCong.com https://fb.com/tailieudientucntt
Cây tổng quát
• Cài đặt gián tiếp qua cây nhị phân
Nhận xét:

om
– Cách cài đặt này cho phép ta cài đặt một cây bất kì, có thể có

.c
cấp rất lớn và rất hiệu quả về bộ nhớ.

ng
– Cần thêm quá trình chuyển đổi ngữ nghĩa thuận và nghịch giữa

co
cây tổng quát và cây nhị phân. Ví như bổ sung một nút là con

an
cả của một nút trong cây tổng quát sẽ thành bổ sung một nút
th
thành nút con trái trong cây NP => giảm tốc độ thực hiện các
ng
thao tác cơ bản như bổ sung, tìm kiếm trên cây.
o
du
u
cu

Bộ Môn ĐT-KTMT - Viện ĐT-VT. Chương 11: Cấu trúc cây 53


CuuDuongThanCong.com https://fb.com/tailieudientucntt
Ứng dụng của cấu trúc cây
• Một số ứng dụng cây NP
– Cây nhị phân tìm kiếm: ứng dụng vào lưu trữ và tìm kiếm

om
thông tin một các hiệu quả nhất (tốn ít bộ nhớ và thời gian chạy

.c
nhanh nhất)

ng
– Cây biểu thức: giúp ta thực hiện hàng loạt các thao tác tính

co
toán cơ bản cũng như phức tạp (do người dùng định nghĩa)

an
– Cây cân bằng
th
ng
• Một số ứng dụng khác
o
du

– Cây biểu diễn các tập hợp


– Cây hỗ trợ ra quyết định: decision tree
u
cu

Bộ Môn ĐT-KTMT - Viện ĐT-VT. Chương 11: Cấu trúc cây 54


CuuDuongThanCong.com https://fb.com/tailieudientucntt
Ứng dụng cấu trúc cây NP
• Cây biểu thức (Ví dụ minh họa)
+
– Biểu diễn biểu thức

om
• Biểu thức = Biểu thức <Phép toán> Biểu thức

.c
• Đặc biệt: Biểu thức = const a b

ng
• Phép toán: +, / , *, -, exp, !, ...

co
! exp
– Dùng cây nhị phân

an
• Gốc: phép toán

th
• Lá: toán hạng n
ng
x
– Nhận xét: *
o
du

• Duyệt cây theo Preorder => biểu thức prefix


u

• Duyệt cây theo Postorder => biểu thức postfix


cu

a +
• Duyệt cây theo Inorder => biểu thức infix
– Ví dụ: a+b, n!, exp(x), a*(d+b)
d b
Bộ Môn ĐT-KTMT - Viện ĐT-VT. Chương 11: Cấu trúc cây 55
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Ứng dụng cấu trúc cây NP
• Cây hỗ trợ ra quyết định (Ví dụ minh họa)
– VD: Có 5 đồng tiền vàng. Trong đó có duy nhất 1 đồng bị nhẹ

om
hơn. Tìm đồng tiền đó?

.c
(A+B) ? (C+D)

ng
co
The bad is in (A,B) < > The bad is in (C,D)

an
th
A? B
ng = C?D
o
du

< > < >


u
cu

A is bad B is bad E is bad C is bad D is bad


Bộ Môn ĐT-KTMT - Viện ĐT-VT. Chương 11: Cấu trúc cây 56
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Bài tập
• Bài 1: Xây dựng một template class BinaryTree cho phép chứa các phần tử có
kiểu khác nhau của cây nhị phân. Đồng thời nó có cài đặt các thao tác sau:

om
– InitBTree(): Khởi tạo một cây rỗng

.c
– InsertParent (type x, PNode P): bổ sung phần tử x trở thành nút cha của nút P trong

ng
cây
– InsertLeftChild(type x, PNode P): bổ sung phần tử x trở thành nút con trái của nút

co
P trong cây

an
– InsertRightChild(type x, PNode P): bổ sung phần tử x trở thành nút con phải của

th
nút P trong cây ng
– PNode FindNode(type x): tìm một nút có giá trị bằng x trong cây, hàm trả về con
trỏ trỏ vào nút tìm thấy, trái lại trả về NULL
o
du

– DeleteCurrentNode(PNode P): xóa nút hiện trỏ bởi P trong cây


u

– DeleteLeftChild(PNode P): xóa nút con trái của P


cu

– DeleteRightChild(PNode P): xóa nút con phải của P


– GetSize(): trả về kích thước của cây

Bộ Môn ĐT-KTMT - Viện ĐT-VT. Chương 11: Cấu trúc cây 57


CuuDuongThanCong.com https://fb.com/tailieudientucntt
Bài tập
• Bài 2: xây dựng một class Folder biểu diễn cây thư mục,

om
trong đó một Folder có thể chứa nhiều File và

.c
SubFolder. Yêu cầu định nghĩa class Folder và cài đặt

ng
các thao tác cơ bản:

co
– Init(): tạo ra một thư mục rỗng

an
– PNode GetCurrentFolder(): trả về con trỏ trỏ vào thư mục
hiện tại
th
ng
– Insert(Folder sub): bổ sung Folder sub thành con của thư mục
o
du

hiện tại
u

– Insert(File f): bổ sung File f thành con trong thư mục hiện tại
cu

– PNode Find(string fname) : tìm tên file hoặc thư mục có tên
fname cho trước. Hàm trả về con trỏ trỏ vào nút tìm được

Bộ Môn ĐT-KTMT - Viện ĐT-VT. Chương 11: Cấu trúc cây 58


CuuDuongThanCong.com https://fb.com/tailieudientucntt
Bài tập
• Bài 3: xây dựng một cây biểu thức, trong đó các nút

om
trong chứa các phép toán +,-,*,/; còn các nút lá chứa các

.c
toán hạng là các hằng số hoặc biến số. Yêu cầu định

ng
nghĩa class Expression để biểu diễn cho cây trên, đồng

co
thời cài đặt các hàm sau:

an
– Init(): khởi tạo một biểu thức rỗng
th
– Init(string exp): khởi tạo một cây biểu thức từ chuỗi biểu thức
ng
exp
o
du

– Value(): tính giá trị cây biểu thức


u
cu

Bộ Môn ĐT-KTMT - Viện ĐT-VT. Chương 11: Cấu trúc cây 59


CuuDuongThanCong.com https://fb.com/tailieudientucntt
Xin cảm ơn!

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

Bộ Môn ĐT-KTMT - Viện ĐT-VT. Chương 11: Cấu trúc cây 60


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

You might also like