<span class='text_page_counter'>(1)</span><div class='page_container' data-page=1>
CH
ƯƠ
NG 1: CÂY (TREE)
GV. Ngô Công Th
ắ
ng
B
ộ
môn Công ngh
ệ
ph
ầ
n m
ề
m
Khoa Công ngh
ệ
thông tin
Website: dse.hua.edu.vn/ncthang
Email:
Ch
ươ
ng 1: Cây (Tree)
1.
Đị
nh ngh
ĩ
a và khái ni
ệ
m
2. Cây nh
ị
phân
</div>
<span class='text_page_counter'>(2)</span><div class='page_container' data-page=2>
Ngô Công Thắng Bài giảng Cấu trúc dữ liệu và giải thuật 2 - Chương 01
1.
Đị
nh ngh
ĩ
a và khái ni
ệ
m
1.1.
Đị
nh ngh
ĩ
a cây (tree)
l
Cây là m
ộ
t 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.
l
M
ộ
t cây khơng có nút nào g
ọ
i là cây r
ỗ
ng
(null tree).
l
Các ví d
ụ
v
ề
cây
1.3
Ví d
ụ
1: M
ụ
c l
ụ
c c
ủ
a m
ộ
t ch
ươ
ng
đượ
c bi
ể
u di
ễ
n d
ạ
ng cây
Ch
ươ
ng 6
6.1
6.2
6.2.1
6.2.2
6.3
</div>
<span class='text_page_counter'>(3)</span><div class='page_container' data-page=3>
Ngô Công Thắng Bài giảng Cấu trúc dữ liệu và giải thuật 2 - Chương 01
Ví d
ụ
2: Bi
ể
u th
ứ
c s
ố
h
ọ
c
đượ
c
bi
ể
u di
ễ
n d
ạ
ng cây
x+y*(z-t)+u/v
1.5
Ví d
ụ
3: Các t
ậ
p bao nhau
đượ
c
bi
ể
u di
ễ
n d
ạ
ng cây
</div>
<span class='text_page_counter'>(4)</span><div class='page_container' data-page=4>
Ngô Công Thắng Bài giảng Cấu trúc dữ liệu và giải thuật 2 - Chương 01
1.2. Các khái ni
ệ
m
l
G
ố
c (Root): G
ố
c là nút
đặ
c bi
ệ
t khơng có
nút cha.
Ví d
ụ
3: A là g
ố
c. A là cha c
ủ
a B, E, F.
B, E, F là con c
ủ
a A.
B, E, F c
ũ
ng là g
ố
c c
ủ
a các cây con c
ủ
a A
l
C
ấ
p (Degree): S
ố
con c
ủ
a m
ộ
t nút g
ọ
i là
c
ấ
p c
ủ
a nút
đ
ó.
Ví d
ụ
3: A có c
ấ
p là 3. E, F có c
ấ
p là 0.
B có c
ấ
p là 2.
1.7
1.2. Các khái ni
ệ
m (
<i>ti</i>
<i>ế</i>
<i>p</i>
)
l
Lá (Leaf): Nút có c
ấ
p b
ằ
ng khơng g
ọ
i là lá hay
nút t
ậ
n cùng.
Ví d
ụ
3: C,D,E,F là lá.
l
Nút nhánh (Branch Node): Nút không là lá
đượ
c
g
ọ
i là nút nhánh hay nút trong.
<i>Ví d</i>
<i>ụ</i>
<i> 3:</i>
B là nút nhánh.
l
M
ứ
c (Level): G
ố
c cây có m
ứ
c là 1. N
ế
u nút cha
có m
ứ
c là i thì nút con có m
ứ
c là i+1.
</div>
<span class='text_page_counter'>(5)</span><div class='page_container' data-page=5>
Ngơ Công Thắng Bài giảng Cấu trúc dữ liệu và giải thuật 2 - Chương 01
1.2. Các khái ni
ệ
m (
<i>ti</i>
<i>ế</i>
<i>p</i>
)
l
Chi
ề
u cao c
ủ
a cây (Height) hay chi
ề
u sâu c
ủ
a
cây (Depth): Là s
ố
m
ứ
c l
ớ
n nh
ấ
t c
ủ
a nút có trên
cây.
Ví d
ụ
1: Cây có chi
ề
u cao là 3
Ví d
ụ
2: Cây có chi
ề
u cao là 5
Ví d
ụ
3: Cây có chi
ề
u cao là 3
l
Đườ
ng
đ
i (Path): N
ế
u n
<sub>1</sub>
, n
<sub>2</sub>
, ..., n
<sub>k</sub>
là các dãy nút
mà n
<sub>i</sub>
là cha c
ủ
a n
<sub>i+1</sub>
(1
≤
i<k) thì dãy
đ
ó g
ọ
i là
đườ
ng
đ
i t
ừ
n
<sub>1</sub>
đế
n n
<sub>k</sub>
.
Độ
dài c
ủ
a
đườ
ng
đ
i
b
ằ
ng s
ố
nút tr
ừ
đ
i 1. .
Ví d
ụ
3:
Đườ
ng
đ
i t
ừ
A
đế
n C c
ố
độ
dài là 3-1=2.
Đườ
ng
đ
i t
ừ
A
đế
n E c
ố
độ
dài là 2-1=1.
1.9
1.2. Các khái ni
ệ
m (
<i>ti</i>
<i>ế</i>
<i>p</i>
)
l
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
ự
.
l
Th
ườ
ng thì th
ứ
t
ự
các cây con c
ủ
a m
ộ
t nút
</div>
<span class='text_page_counter'>(6)</span><div class='page_container' data-page=6>
Ngô Công Thắng Bài giảng Cấu trúc dữ liệu và giải thuật 2 - Chương 01
1.2. Các khái ni
ệ
m (
<i>ti</i>
<i>ế</i>
<i>p</i>
)
l
Đố
i v
ớ
i cây, ngoài quan h
ệ
cha con, ng
ườ
i
ta còn m
ở
r
ộ
ng ph
ỏ
ng theo quan h
ệ
trong
gia t
ộ
c.
l
R
ừ
ng (Forest): 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.
l
N
ế
u b
ỏ
nút g
ố
c c
ủ
a m
ộ
t cây thì ta s
ẽ
có
m
ộ
t r
ừ
ng.
1.11
2. Cây nh
ị
phân
2.1.
Đị
nh ngh
ĩ
a và tính ch
ấ
t
2.1.1.
Đị
nh ngh
ĩ
a cây nh
ị
phân
l
Cây nh
ị
phân là d
ạ
ng
đặ
c bi
ệ
t c
ủ
a c
ấ
u trúc
cây, m
ọ
i nút trên cây ch
ỉ
có t
ố
i
đ
a là 2 con.
</div>
<span class='text_page_counter'>(7)</span><div class='page_container' data-page=7>
Ngô Công Thắng Bài giảng Cấu trúc dữ liệu và giải thuật 2 - Chương 01
Ví d
ụ
1: Hai cây sau
đ
ây là khác nhau
1.13
Ví d
ụ
2: Cây nh
ị
phân suy bi
ế
n có
d
ạ
ng m
ộ
t danh sách tuy
ế
n tính
Cây l
ệ
ch trái
</div>
<span class='text_page_counter'>(8)</span><div class='page_container' data-page=8>
Ngơ Cơng Thắng Bài giảng Cấu trúc dữ liệu và giải thuật 2 - Chương 01
Ví d
ụ
2: Cây nh
ị
phân suy bi
ế
n có d
ạ
ng
m
ộ
t danh sách tuy
ế
n tính (
<i>ti</i>
<i>ế</i>
<i>p</i>
)
Cây zíc z
ắ
c
1.15
2.1.1.
Đị
nh ngh
ĩ
a cây nh
ị
phân (
<i>ti</i>
<i>ế</i>
<i>p</i>
)
</div>
<span class='text_page_counter'>(9)</span><div class='page_container' data-page=9>
Ngô Công Thắng Bài giảng Cấu trúc dữ liệu và giải thuật 2 - Chương 01
2.1.1.
Đị
nh ngh
ĩ
a cây nh
ị
phân (
<i>ti</i>
<i>ế</i>
<i>p</i>
)
l
Cây nh
ị
phân
đầ
y
đủ
: Là cây nh
ị
phân mà các
nút
ở
m
ọ
i m
ứ
c c
ủ
a nút nhánh
đề
u có hai con.
Cây nh
ị
phân
đầ
y
đủ
là tr
ườ
ng h
ợ
p
đặ
c bi
ệ
t c
ủ
a
cây nh
ị
phân hồn ch
ỉ
nh.
1.17
2.1.2. Tính ch
ấ
t
l
S
ố
l
ượ
ng t
ố
i
đ
a các nút
ở
m
ứ
c i trên 1 cây
nh
ị
phân là 2
(i-1)
<sub>(i</sub>
≥
<sub>1).</sub>
</div>
<span class='text_page_counter'>(10)</span><div class='page_container' data-page=10>
Ngô Công Thắng Bài giảng Cấu trúc dữ liệu và giải thuật 2 - Chương 01
2.2. L
ư
u tr
ữ
cây nh
ị
phân
2.2.1. L
ư
u tr
ữ
k
ế
ti
ế
p
l
V
ớ
i cây nh
ị
phân
đầ
y
đủ
, ta
đ
ánh s
ố
các
nút t
ừ
1 tr
ở
đ
i, t
ừ
trái qua ph
ả
i, h
ế
t m
ứ
c
này
đế
n m
ứ
c khác.
l
Dùng véc t
ơ
V l
ư
u tr
ữ
cây nh
ị
phân, nút th
ứ
i c
ủ
a cây
đượ
c l
ư
u tr
ữ
ở
ơ nh
ớ
V[i]. Ví d
ụ
:
1.19
2.2.1. L
ư
u tr
ữ
k
ế
ti
ế
p (
<i>ti</i>
<i>ế</i>
<i>p</i>
)
l
V
ớ
i cách l
ư
u tr
ữ
b
ằ
ng m
ả
ng, khi bi
ế
t
đị
a
ch
ỉ
c
ủ
a nút cha s
ẽ
tính
đượ
c
đị
a ch
ỉ
c
ủ
a
nút con và ng
ượ
c l
ạ
i. N
ế
u nút cha là i thì
con trái là 2i và con ph
ả
i là 2i+1. N
ế
u nút
con là i thì nút cha là [i/2].
l
N
ế
u cây không
đầ
y
đủ
ta ph
ả
i thêm các
nút tr
ố
ng vào
để đươ
c cây nh
ị
phân
đầ
y
</div>
<span class='text_page_counter'>(11)</span><div class='page_container' data-page=11>
Ngô Công Thắng Bài giảng Cấu trúc dữ liệu và giải thuật 2 - Chương 01
Ví d
ụ
1.21
2.2.2. L
ư
u tr
ữ
ph
ầ
n tán
l
Trong cách l
ư
u tr
ữ
này, m
ỗ
i nút
ứ
ng v
ớ
i m
ộ
t
ph
ầ
n t
ử
nh
ớ
có quy cách d
ướ
i
đ
ây.
l
Để
truy nh
ậ
p vào các nút trong cây nh
ị
phân c
ầ
n
có m
ộ
t con tr
ỏ
T tr
ỏ
vào nút g
ố
c c
ủ
a cây
đ
ó.
</div>
<span class='text_page_counter'>(12)</span><div class='page_container' data-page=12>
Ngơ Cơng Thắng Bài giảng Cấu trúc dữ liệu và giải thuật 2 - Chương 01
Ví d
ụ
1.23
2.3. Các phép tốn duy
ệ
t cây nh
ị
phân
l
Phép x
ử
lý các nút trên cây (g
ọ
i chung là
phép th
ă
m - visit) là cách th
ă
m t
ấ
t c
ả
các nút
c
ủ
a cây m
ộ
t cách h
ệ
th
ố
ng, sao cho m
ỗ
i nút
ch
ỉ
đượ
c th
ă
m m
ộ
t l
ầ
n.
l
M
ộ
t nút có 2 con, ta có 3 cách duy
ệ
t, các
cách duy
ệ
t
đượ
c
đị
nh ngh
ĩ
a
đệ
quy nh
ư
sau:
l
Cách 1: Duy
ệ
t theo th
ứ
t
ự
tr
ướ
c (preorder
traversal)
</div>
<span class='text_page_counter'>(13)</span><div class='page_container' data-page=13>
Ngô Công Thắng Bài giảng Cấu trúc dữ liệu và giải thuật 2 - Chương 01
2.3. Duy
ệ
t cây nh
ị
phân (
<i>ti</i>
<i>ế</i>
<i>p</i>
)
l
Cách 2: Duy
ệ
t theo th
ứ
t
ự
gi
ữ
a (inorder
traversal)
l
Duy
ệ
t cây con trái theo th
ứ
t
ự
gi
ữ
a
l
Th
ă
m g
ố
c
l
Duy
ệ
t cây con ph
ả
i theo th
ứ
t
ự
gi
ữ
a
l
Cách 3: Duy
ệ
t theo th
ứ
t
ự
sau ( postorder
traversal)
l
Duy
ệ
t cây con trái theo th
ứ
t
ự
sau
l
Duy
ệ
t cây con ph
ả
i theo th
ứ
t
ự
sau
l
Th
ă
m g
ố
c
1.25
</div>
<span class='text_page_counter'>(14)</span><div class='page_container' data-page=14>
Ngô Công Thắng Bài giảng Cấu trúc dữ liệu và giải thuật 2 - Chương 01
2.3. Duy
ệ
t cây nh
ị
phân (
<i>ti</i>
<i>ế</i>
<i>p</i>
)
l
Các th
ủ
t
ụ
c duy
ệ
t cây nh
ị
phân
đề
u
đượ
c
vi
ế
t
ở
d
ạ
ng
đệ
qui.
l
Gi
ả
s
ử
cây nh
ị
phân l
ư
u tr
ữ
b
ằ
ng danh
sách liên k
ế
t, T là con tr
ỏ
tr
ỏ
t
ớ
i g
ố
c, phép
th
ă
m là in giá tr
ị
tr
ườ
ng Infor c
ủ
a nút
đ
ó.
1.27
Duy
ệ
t cây theo th
ứ
t
ự
tr
ướ
c:
Procedure PreOrder(T)
If T =
φ
then
Return
Else Begin
Write(Infor(T))
Call PreOrder(Lptr(T))
Call PreOrder(Rptr(T))
</div>
<span class='text_page_counter'>(15)</span><div class='page_container' data-page=15>
Ngô Công Thắng Bài giảng Cấu trúc dữ liệu và giải thuật 2 - Chương 01
Duy
ệ
t cây theo th
ứ
t
ự
gi
ữ
a:
Procedure InOrder(T)
If T =
φ
then Begin
Return
End
Else Begin
Call InOrder(Lptr(T))
Write(Infor(T))
Call InOrder(Rptr(T))
End;
Return
1.29
Duy
ệ
t cây theo th
ứ
t
ự
sau:
Procedure PostOrder(T)
If T =
φ
then Begin
</div>
<span class='text_page_counter'>(16)</span><div class='page_container' data-page=16>
Bài t
ậ
p
l
Bài 1:
l
Xây d
ự
ng cây nh
ị
phân bi
ể
u di
ễ
n bi
ể
u th
ứ
c:
(a+b/c)*(d-e*f)
l
V
ẽ
s
ơ đồ
l
ư
u tr
ữ
cây nh
ị
phân bi
ể
u di
ễ
n bi
ể
u
th
ứ
c
ở
d
ạ
ng l
ư
u tr
ữ
k
ế
ti
ế
p, l
ư
u tr
ữ
liên k
ế
t.
l
Cho bi
ế
t th
ứ
t
ự
các nút khi duy
ệ
t cây nh
ị
phân
đ
ó theo 3 cách.
Ngơ Cơng Thắng Bài giảng Cấu trúc dữ liệu và giải thuật 2 - Chương 01 1.31
Bài t
ậ
p (ti
ế
p)
Bài 2. Cho cây nh
ị
phân d
ướ
i
đ
ây. Hãy
l
V
ẽ
s
ơ
đồ
l
ư
u tr
ữ
cây nh
ị
phân
ở
d
ạ
ng l
ư
u tr
ữ
k
ế
ti
ế
p và l
ư
u tr
ữ
liên k
ế
t
</div>
<span class='text_page_counter'>(17)</span><div class='page_container' data-page=17>
Ngô Công Thắng Bài giảng Cấu trúc dữ liệu và giải thuật 2 - Chương 01
<b>3. Cây t</b>
<b>ổ</b>
<b>ng quát</b>
l
Cây t
ổ
ng quát là cây có c
ấ
p m nào
đ
ó.
l
N
ế
u bi
ể
u di
ễ
n cây t
ổ
ng quát b
ằ
ng danh sách
liên k
ế
t thì m
ộ
t nút có bao nhiêu nhánh s
ẽ
có
b
ấ
y nhiêu tr
ườ
ng liên k
ế
t, cách bi
ể
u di
ễ
n này
ph
ứ
c t
ạ
p. N
ế
u bi
ể
u di
ễ
n cây b
ằ
ng m
ả
ng thì quá
trình x
ử
lý c
ũ
ng r
ấ
t ph
ứ
c t
ạ
p.
l
Để
đơ
n gi
ả
n ta bi
ể
u di
ễ
n cây t
ổ
ng quát b
ằ
ng cây
nh
ị
phân. Ta nh
ậ
n th
ấ
y v
ớ
i b
ấ
t k
ỳ
nút nào trên
cây t
ổ
ng qt n
ế
u có thì ch
ỉ
có:
l
M
ộ
t nút con c
ự
c trái (con c
ả
)
l
M
ộ
t nút em k
ề
c
ậ
n ph
ả
i
1.33
<b>3. Cây t</b>
<b>ổ</b>
<b>ng quát</b>
l
Khi chuy
ể
n sang cây nh
ị
phân t
ươ
ng
đươ
ng,
m
ỗ
i nút có con trái là con c
ự
c trái, con ph
ả
i là
em k
ề
c
ậ
n ph
ả
i.
</div>
<span class='text_page_counter'>(18)</span><div class='page_container' data-page=18>
Ngô Công Thắng Bài giảng Cấu trúc dữ liệu và giải thuật 2 - Chương 01
Ví d
ụ
:
Cây t
ổ
ng quát
Cây nh
<sub>t</sub>
<sub>ươ</sub>
<sub>ng </sub>
<sub>đươ</sub>
ị
phân
<sub>ng</sub>
1.35
<b>3. Cây t</b>
<b>ổ</b>
<b>ng quát</b>
l
Sau khi chuy
ể
n thành cây nh
ị
phân t
ươ
ng
đươ
ng ta có th
ể
l
ư
u tr
ữ
cây t
ổ
ng quát
b
ằ
ng danh sách liên k
ế
t.
</div>
<span class='text_page_counter'>(19)</span><div class='page_container' data-page=19>
Ngô Công Thắng Bài giảng Cấu trúc dữ liệu và giải thuật 2 - Chương 01
4.
Ứ
ng d
ụ
ng
4.1. Cây bi
ể
u di
ễ
n bi
ể
u th
ứ
c
l
Bi
ể
u th
ứ
c s
ố
h
ọ
c v
ớ
i các phép tốn 2 ngơi nh
ư
+ - * / có th
ể
bi
ể
u di
ễ
n b
ở
i cây nh
ị
phân có các
nút v
ớ
i quy cách nh
ư
sau:
1.37
4.1. Cây bi
ể
u di
ễ
n bi
ể
u th
ứ
c (
<i>ti</i>
<i>ế</i>
<i>p</i>
)
</div>
<span class='text_page_counter'>(20)</span><div class='page_container' data-page=20>
Ngô Công Thắng Bài giảng Cấu trúc dữ liệu và giải thuật 2 - Chương 01
Ví d
ụ
: Bi
ể
u di
ễ
n bi
ể
u th
ứ
c a*b+c/2
b
ằ
ng cây nh
ị
phân sau:
1.39
4.2.
Đị
nh giá tr
ị
bi
ể
u th
ứ
c
l
Thu
ậ
t gi
ả
i
đị
nh giá tr
ị
bi
ể
u th
ứ
c bi
ể
u di
ễ
n b
ở
i cây nh
ị
phân có g
ố
c E.
Thu
ậ
t gi
ả
i này
đượ
c vi
ế
t d
ướ
i d
ạ
ng
đệ
quy:
Function EVAL(E)
Case
TYPE(E)=0: Begin F:=RPTR(E)
Return(Value(F))
End
TYPE(E)=1: Return ( EVAL(LPTR(E))+EVAL(RPTR(E)))
TYPE(E)=2: Return ( EVAL(LPTR(E))-EVAL(RPTR(E)))
TYPE(E)=3: Return ( EVAL(LPTR(E))*EVAL(RPTR(E)))
TYPE(E)=4: Return ( EVAL(LPTR(E))/EVAL(RPTR(E)))
TYPE(E)=5: Return ( - EVAL(RPTR(E)))
Else Return(00)
End case
</div>
<span class='text_page_counter'>(21)</span><div class='page_container' data-page=21>
Ngô Công Thắng Bài giảng Cấu trúc dữ liệu và giải thuật 2 - Chương 01
4.3. Xác
đị
nh 2 bi
ể
u th
ứ
c t
ươ
ng
đươ
ng
l
Cho 2 cây nh
ị
phân bi
ể
u di
ễ
n bi
ể
u th
ứ
c tr
ỏ
b
ở
i A, B. Hàm xác
đị
nh 2 bi
ể
u th
ứ
c t
ươ
ng
đươ
ng Similar cho giá tr
ị
True n
ế
u 2 bi
ể
u
th
ứ
c t
ươ
ng
đươ
ng, ng
ượ
c l
ạ
i cho giá tr
ị
False.
1.41
Hàm Similar
Function Similar(A,B)
B
ướ
c 1 { Ki
ể
m tra lo
ạ
i g
ố
c cây}
If TYPE(A)# TYPE(B) then Return(False)
B
ướ
c 2 { Ki
ể
m tra tính t
ươ
ng
đươ
ng }
Case
TYPE(A)=0 : If Value(RPTR(A)) # Value(RPTR(B)) then Return(False)
Else Return(True)
TYPE(A)=1 OR TYPE(A)=3 : { Phép + ho
ặ
c * }
Begin
</div>
<span class='text_page_counter'>(22)</span><div class='page_container' data-page=22>
Ngô Công Thắng Bài giảng Cấu trúc dữ liệu và giải thuật 2 - Chương 01
BTVN
l
Xây d
ự
ng cây nh
ị
phân bi
ể
u di
ễ
n bi
ể
u
th
ứ
c sau: a/b - c*d
l
Vi
ế
t gi
ả
mã tính giá tr
ị
c
ủ
a bi
ể
u th
ứ
c trên.
</div>
<!--links-->