You are on page 1of 27

Chương 5

Cây

LOGO
Nội dung

1. Định nghĩa và khái niệm


2. Cây nhị phân
2.1. Định nghĩa và tính chất
2.2. Biểu diễn cây nhị phân
2.3. Phép duyệt cây nhị phân
Định nghĩa và khái niệm…
 Một cây là tập hợp hữu hạn các nút trong đó có
một nút đặc biệt gọi là gốc (root). Giữa các nút
có một quan hệ phân cấp gọi là “quan hệ cha
con”.
 Định nghĩa đệ qui:
1. Một nút là một cây và là gốc của cây ấy.
2. Nếu n là một nút và T1, T2,…, Tk là các cây với r1, r2,
…., rk lần lượt là các gốc, thì một cây mới T sẽ được
tạo lập bằng cách cho nút n trở thành cha của các
nút r1, r2, …., rk;
=> n là gốc còn T1, T2,…, Tk là các cây con của gốc.
Định nghĩa và khái niệm…
Định nghĩa và khái niệm…
 Cây không có nút nào, gọi là
cây rỗng
 Số các con của một nút gọi là
cấp (degree) của nút đó. Ví dụ
cấp của A là 3, cấp của H là 2.

 Nút có cấp bằng không gọi là lá hay nút tận cùng


 Nút không là lá được gọi là nút nhánh
 Cấp cao nhất của nút trên cây gọi là cấp của cây đó.
Ví dụ cây ở trên là cây cấp 3.
 Gốc của cây có mức (level) là 1. Nếu nút cha có mức
là i thì nút con có mức là i + 1.
Định nghĩa và khái niệm
 Chiều cao hay chiều
sâu của một cây là
số mức lớn nhất của
nút có trên cây đó.
 Nếu n1, n2, …, nk là dãy các nút mà ni là cha của ni+1 với
1≤i k-1, thì dãy đó gọi là đường đi từ n1 tới nk.
 Độ dài của đường đi bằng số nút trên đường đi trừ đi 1.
 Nếu thứ tự các cây con của một nút được coi trọng thì
cây đang xét là cây có thứ tự, ngược lại là cây không có
thứ tự. Thường thứ tự các cây con của một nút được đặt
từ trái sang phải.
 Nếu có một tập hữu hạn các cây phân biệt thì ta gọi tập
đó là rừng.
Cây nhị phân

 Cây nhị phân


 mọi nút trên cây chỉ có tối đa là hai con
 cây con của một nút phân biệt cây con trái và
cây con phải => cây có thứ tự.
 Ví dụ:
 Cây rỗng:
 Cây có 1 node: là node gốc
 Cây có 2 node:
Các định nghĩa khác
 Mức:
 Node gốc ở mức 0.
 Node gốc của các cây con của một node ở
mức m là m+1.
 Chiều cao:
 Cây rỗng là 0.
 Chiều cao lớn nhất của 2 cây con cộng 1
Hoặc: mức lớn nhất của các node cộng 1.
 Đường đi (path)
 Tên các node của quá trình đi từ node gốc
theo các cây con đến một node nào đó.
Các định nghĩa khác
 Node trước, sau, cha, con:
 Node x là trước node y (node y là sau node
x), nếu trên đường đi đến y có x.
 Node x là cha node y (node y là con node x),
nếu trên đường đi đến y node x nằm ngay
trước node y.
 Node lá là node không có cây con nào.
 Node trung gian không là node gốc hay node
lá.
Cây nhị phân suy biến

a) b) c) d)
 Cây lệch trái: a
 Cây lệch phải: b
 Cây zic-zắc: c và d
Các loại cây nhị phân
Cây hoàn chỉnh Cây đầy đủ

Cây gần đầy


Tính chất của cây nhị phân
 Chiều cao của cây có n node:
 Trung bình h = [logn] + 1
 Đầy đủ h = log(n + 1)
 Suy biến h = n
 Số phần tử tại mức i nhiều nhất là 2i
 Số lượng tối đa các nút trên một cây nhị
phân có chiều cao là h là 2h-1
Biểu diễn cây nhị phân…
Biểu diễn cây nhị phân
 Bằng móc nối: mỗi
nút có cấu trúc:

 DATA chứa dữ liệu


của nút.
 P_L là con trỏ trái, trỏ
tới cây con trái của
nút đó.
 P_R là con trỏ phải,
trỏ tới cây con phải
của nút đó.
Phép duyệt cây nhị phân
 Duyệt qua từng node của cây (mỗi node 1 lần)
 Cách duyệt:
 Theo thứ tự trước - NLR (preorder)
• Thăm gốc
• Duyệt cây con trái theo thứ tự trước
• Duyệt cây con phải theo thứ tự trước
 Theo thứ tự giữa - LNR (inorder)
• Duyệt cây con trái theo thứ tự giữa
• Thăm gốc
• Duyệt cây con phải theo thứ tự giữa
 Theo thứ tự sau - LRN (postorder)
Phép duyệt cây nhị phân
 Theo thứ tự trước – NLR:
++x*y–zt/uv
 Theo thứ tự giữa – LNR:
x+y*z–t+u/v
 Theo thứ tự sau – LRN
xyzt-*+uv/+
Theo thứ tự trước - NLR

TT_TRUOC(T)
{ /* Phép thăm ở đây được đặc trưng bởi việc in
giá trị thành phần DATA của nút */
if (T != NULL)
{
printf(T->DATA);
TT_TRUOC(T->P_L);
TT_TRUOC(T->P_R);
}
}
Theo thứ tự giữa - LNR

TT_GIUA(T)
{
if (T != NULL)
{
TT_GIUA(T->P_L);
printf(T->DATA);
TT_GIUA(T->P_R);
}
}
Theo thứ tự sau - LRN

TT_SAU(T)
{
if (T != NULL)
{
TT_SAU(T->P_L);
TT_SAU(T->P_R);
printf(T->DATA);
}
}
Hàm duyệt trước không đệ quy
TT_TRUOC_S(T) {/* T trỏ tới gốc cây, S-ngăn xếp (được cài đặt
bằng mảng) với biến trỏ TOP trỏ tới đỉnh. Con trỏ P được dùng để trỏ tới
nút hiện đang được xem xét. */
if (T == NULL)
{ P= POP(S, TOP);
printf(“Cây rỗng‟); while (P != NULL)
return; //xuống con trái
} {
else printf(P->DATA); // Thăm P
{ if (P->P_R!= NULL)
TOP = -1; PUSH(S, TOP,P->P_R); //
Lưu trữ địa chỉ gốc cây con phải
PUSH(S, TOP, T);
} P= P->P_L; // Xuống con trái

while (TOP > -1) }


{ }
}
Hàm duyệt sau không đệ quy
TT_SAU_S(T) {/* nút “gốc” chỉ được thăm sau khi đã duyệt xong hai con của nó =>
chỉ khi từ con phải đi lên gặp gốc thì gốc mới được thăm, chứ không phải ở lần gặp gốc khi từ
con trái đi lên => để phân biệt người ta đưa thêm dấu âm vào địa chỉ (địa chỉ âm) để đánh
dấu cho lần đi lên từ con phải */
if (T == NULL)
{ P = P->P_L;
printf(“Cây rỗng‟); }
return;
} while (S[TOP] < 0)
//Thăm nút mà con trái và con phải đã duyệt
else
{
{
TOP = -1; P = POP(S, TOP)
P=T; printf(P->DATA);
} if (TOP == -1)
while (1) return
{ }
while (P != NULL) P= S[TOP]->P_R;
//Lưu trữ địa chỉ “gốc” và xuống con trái
// Xuống con phải và đánh dấu
{ S[TOP]= - S[TOP];
PUSH (S, TOP, P);
}
}
Q&A
Bài tập áp dụng
1. Cho cây:
a) Các nút nào là nút lá?
b) Các nút nào là nút nhánh?
c) Cha của nút G là nút nào?
d) Con của nút C là nút nào?
e) Các nút nào là anh em của B?
f) Mức của D, của L là bao nhiêu?
g) Cấp của B, của D là bao nhiêu? Cấp của cây này là bao
nhiêu?
h) Chiều cao của cây này là bao nhiêu?
i) Độ dài đường đi từ A tới F, từ A tới O là bao nhiêu?
j) Có bao nhiêu đường đi có độ dài 3 trên cây này?
Bài tập áp dụng
2. Vẽ cây nhị phân biểu diễn các biểu thức sau
đây và viết chúng dưới dạng tiền tố, hậu tố.
Bài tập áp dụng
3. Cho cây nhị phân
Hãy viết dãy các nút được thăm khi duyệt cây
này:
a) Theo thứ tự trước
b) Theo thứ tự giữa
c) Theo thứ tự sau
Bài tập áp dụng
4. Cho cây nhị phân hoàn chỉnh
Hãy minh hoạ mảng 1 chiểu lưu trữ cây này.
Bài tập áp dụng
5. Lập hàm không đệ qui thực hiện phép duyệt
cấp nhị phân trỏ bởi T theo thứ tự giữa.
6. Lập giải thuật đệ qui thực hiện việc lập bản
sao của một cây nhị phân trỏ bởi T (tạo lập
một cây y hệt cây T)
7. Lập giải thuật đệ qui thực hiện việc đảo thứ
tự trái, phải của các con của mọi nút trên cây
nhị phân trỏ bởi T.

You might also like