CẤU TRÚC DỮ LIỆU
VÀ GIẢI THUẬT
Lý thuyết
Phần 3 ((Chương
g 4))
Cây
Khái niệm
Một số ứng dụng
set và map
Vũ Anh Dũng - Khoa CNTT
2
Khái niệm
Định nghĩa
Cây là tập các nút
Tập này có thể rỗng
Bao gồm 1 nút đặc biệt,
biệt được gọi là gốc r
Một tập rỗng hoặc khác rỗng các cây con T1,
T2,…,T
Tk mà có gốc được nối trực tiếp với gốc r.
r
Vũ Anh Dũng - Khoa CNTT
3
Khái niệm
Gốc của mỗi cây con được gọi là con của r,
và r được gọi là cha của các nút gốc của các
cây con.
Cây tổng quát
Vũ Anh Dũng - Khoa CNTT
4
Khái niệm
Mỗi nút, loại trừ nút gốc đều chỉ có 1 nút
cha
Cây
y
Vũ Anh Dũng - Khoa CNTT
5
Khái niệm
Nút lá(leaf) là nút không có con, ví dụ : P,Q
Các nút có cùng nút cha được gọi là các nút
anh-chị-em (sibling), ví dụ : K,L,M
Vũ Anh Dũng - Khoa CNTT
6
Khái niệm
Một đường đi từ nút n1 đến nk được định
nghĩa là một chuỗi các nút n1, n2, n3, .. ,nk
trong đó nút ni là cha của nút ni+1 với 1≤i
Chiều dài của đường đi là số lượng cạnh
trên đó, đường đi từ n1 đến nk có chiều dài
là k-1
Trên một cây chỉ có một đường đi duy nhất
từ gốc
ố đến
đế mỗi
ỗi nút
út còn
ò lại
l i
Vũ Anh Dũng - Khoa CNTT
7
Khái niệm
Chiều sâu của nút là chiều dài đường đi từ
nút gốc đến nó
Chiều sâu của nút gốc là 0
Chiề cao của
Chiều
ủ một
ột nút
út ni là chiều
hiề dài
đường đi dài nhất từ ni đến một nút lá
Do đó tất
ấ cả các nút lá có chiều
ề cao bằng
ằ 0
Chiều cao của cây
y là chiều cao của nút g
gốc
Vũ Anh Dũng - Khoa CNTT
8
Khái niệm
Ví dụ
Nút E có chiều sâu 1 và chiều cao 2
Chiều cao của cây là 3
Chiều sâu của cây là độ sâu nhất của nút lá.
lá
Chiều sâu của cây bằng chiều cao của cây
Vũ Anh Dũng - Khoa CNTT
9
Cài đặt cây
1 struct TreeNode
2 {
3
Obj
Object
t element;
l
t
4
TreeNode *firstChild;
5
TreeNode *nextSibling;
6 };
Mũii tên chỉ
h xuống
ố minh
i h
họa firstChild
Mũi tên nằm ngang
g g
chiều hướng từ trái sang
phải mô tả nextSibling
Các liên kết rỗng (null)
không được vẽ vì số
lượng của chúng rất nhiều
Vũ Anh Dũng - Khoa CNTT
10
Duyệt cây
Ví dụ về duyệt cây thư mục
Dấu * bên cạnh tên chỉ ra rằng đó là thư mục
Vũ Anh Dũng - Khoa CNTT
11
Duyệt cây
Giả sử chúng ta muốn đưa ra danh sách tên
của tất cả các file trong một thư mục
Cách đưa ra của chúng ta là với các file nằm
ở độ sâu thì khi đưa ra ta sẽ đưa ra tên của
file đó dịch vào khoảng trống (tab)
Vũ Anh Dũng - Khoa CNTT
12
Duyệt cây
void FileSystem::listAll ( int depth = 0 ) const
{
1 p
printName(
t a e( dept
depth ); // Print
t t
the
e name
a e o
of t
the
e
object
2 if ( isDirectory( ) )
3 for each file c in this directory (for each
child)
4 c.listAll ( depth + 1 );
}
Vũ Anh Dũng - Khoa CNTT
13
Duyệt cây
int FileSystem::size( ) const
{
int totalSize = sizeOfThisFile( );
if ( isDirectory( ) )
for each file c in this directory
totalSize += c.size( );
return totalSize;
}
Vũ Anh Dũng - Khoa CNTT
14
Cây nhị phân
Cây nhị phân là cây mà mỗi nút có không
quá 2 con,
con hai cây con này có thể rỗng
Vũ Anh Dũng - Khoa CNTT
15
Cài đặt cây nhị phân
struct BinaryNode
{
Object element; // The data in the
node
Binar Node * left
BinaryNode
left;
// Left child
BinaryNode * right; // Right child
};
Cấu trúc 1 nút trên cây nhị phân
Vũ Anh Dũng - Khoa CNTT
16
Cây nhị phân biểu thức
Nút lá của cây là các toán hạng, như là
hằng số hoặc các biến
Các nút khác là các toán tử
(a + (b * c)) + (((d * e) + f) * g)
Vũ Anh Dũng - Khoa CNTT
17
Duyệt cây nhị phân biểu thức
Duyệt theo thứ tự trước : toán tử, con trái,
con phải.
phải Ví dụ : ++a
++a*bc*+*defg
bc + defg
Duyệt theo thứ tự giữa : con trái, toán tử,
con phải.
phải
Duyệt theo thứ tự sau : con trái, con phải,
t á tử.
toán
tử Ví dụ
d : abc*+de*f+g*+
b *+d *f+ *+
Vũ Anh Dũng - Khoa CNTT
18
Xây dựng
cây nhị phân biểu thức
Thuật toán chuyển đổi thành cây biểu thức
từ một biểu thức dạng hậu tố
Ví dụ giả sử đầu vào là ab+cde+**
Hai
H i ký tự
t đầu
đầ tiên
tiê là các
á
toán hạng, vì thế chúng ta
tạo hai nút và đNy con trỏ
của hai nút này vào ngăn xếp
Vũ Anh Dũng - Khoa CNTT
19
Xây dựng
cây nhị phân biểu thức
Tiếp đến chúng ta đọc được một toán tử, vì
thế hai con trỏ trong ngăn xếp được lấy ra,
ra
một cây mới được tạo và con trỏ tới nó
được đNy vào ngăn xếp
Vũ Anh Dũng - Khoa CNTT
20
Xây dựng
cây nhị phân biểu thức
Tiếp theo c d e được đọc và ứng với mỗi
toán hạng ta tạo mội nút cây và đNy con trỏ
tương ứng của nó vào ngăn xếp
Vũ Anh Dũng - Khoa CNTT
21
Xây dựng
cây nhị phân biểu thức
Tiếp theo dấu + được đọc, vì thế hai cây
được kết hợp
Vũ Anh Dũng - Khoa CNTT
22
Xây dựng
cây nhị phân biểu thức
Tiếp theo * được đọc, ta lấy ra hai con trỏ
của hai cây trong ngăn xếp và tạo một cây
mới với * là gốc
Vũ Anh Dũng - Khoa CNTT
23
Xây dựng
cây nhị phân biểu thức
Cuối cùng, ký hiệu cuối cùng được đọc, hai
cây được kết hợp và một con trỏ tới cây kết
quả còn lại trong ngăn xếp
Vũ Anh Dũng - Khoa CNTT
24