Bài gi ng c u trúc d li u và gi i thu t
Trang 71
Bài gi ng c u trúc d li u và gi i thu t
Trang 0
KHOA CÔNG NGH THÔNG TIN
B
MÔN KHOA H C MÁY TÍNH
-----------o0o---------
Tài li u tham kh o
[1]
Xuân Lôi, C u trúc d li u và gi i thu t,
[2]Nguy)n
HBK Hà N i
c Ngh-a, C u trúc d li u và gi i thu t, HBK Hà N i, 2012
[3]Tr n H nh Nhi–D
ng Anh
c, Nh p môn c u trúc d li u và gi i thu t,
HKHTN-
HQG TPHCM.
[4]Jhon Bentley, Nh ng viên ng c trong k thu t l p trình.
[5]Robert L. Kruse, Alexander J. Ryba, Data Structures and Program Design in C++,
Prentice Hall, 2000.
[6]Mark Allen Weiss, Data Structures and Algorithm Analysis in Java, PEARSON, 2012.
BÀI GI NG
C U TRÚC D LI U VÀ GI I THU T
(l u hành n i b )
Bài gi ng c u trúc d li u và gi i thu t
Trang 1
Bài gi ng c u trúc d li u và gi i thu t
H4C PH5N C U TRÚC D
Trang 70
LI U VÀ GI I THU T ( 6 S7 17)
Th"i gian làm bài: 90 phút
Câu 1: (3 i m).
L i gi i thi u
a. Cho dãy n s nguyên ao, a1,…,an-1 và m t s nguyên x. Hãy vi t gi i thu t tìm ki m nh
phân ki m tra giá tr x có trong dãy s trên hay không ?
C u trúc d li u và gi i thu t là h c ph n b t bu c thu c kh i ki n th c c s ngành
c a sinh viên các chuyên ngành công ngh thông tin và c ng là n i dung quan tr ng các k
thi t t nghi p, thi hoàn ch nh i h c các chuyên ngành công ngh thông tin.
T p bài gi ng này trình bày các ch
bài t p v :T ng quan v c u trúc d li u và
gi i thu t, tìm ki m, s p x p, c u trúc danh sách liên k t và c u trúc cây theo ngôn ng
C/C++. M i ch
c thi t k g m các ph n: Tóm t t lý thuy t, m t s d ng bài t p i n
hình và m t s bài t p ch n l c. Ph n cu i c a t p bài gi ng có b sung m t s
thi sinh
viên t rèn luy n k n ng phân tích v n bài toán.
T p bài gi ng này
c biên so n
làm tài li u tham kh o khi gi ng các h c ph n
c u trúc d li u và gi i thu t h
i h c. Chúng tôi xin trân tr ng gi i thi u v i b n c t p
bài gi ng này và hy v ng r ng nó s! giúp cho vi c h c t p h c ph n c u trúc d li u và gi i
thu t c a sinh viên khoa công ngh thông tin tr "ng # i h c Sài Gòn
c thu n l i h n.
b. Hãy vi t gi i thu t Quick Sort
c. Cho dãy s : 2 8 5
s(p x p dãy n s nguyên ao, a1,…,an-1 theo th t t ng.
7 4 3 6
Hãy minh h a quá trình x p t ng d n dãy s trên theo gi i thu t Quick Sort.
Câu 2: (4 i m).
Cho danh sách liên k t
a. Hãy
n L; m i nút ch a m t s nguyên.
nh ngh-a c u trúc d li u c a danh sách liên k t L.
b. Hãy vi t gi i thu t s(p x p các ph n t l8 n'm v phía tr
c c a danh sách và các ph n t
ch7n n'm v phía cu i c a danh sách.
c. Cho hai danh sách liên k t
n L1 và L2 mà các giá tr c a nó ã
gi i thu t tr n hai danh sách L1, L2 thành m t danh sách L c&ng
c s(p t ng; hãy vi t
c s(p t ng.
Câu 3: (3 i m).
Thành ph H Chí Minh, ngày 06 tháng 09 n m 2009
TÁC GI$
Cho m t cây nh phân tìm ki m T mà m i nút ch a m t s nguyên; là khóa c a nút ó.
a. Hãy
nh ngh-a c u trúc d li u c a cây T.
b. Hãy vi t gi i thu t tính t!ng giá tr c a các nút ch có m t con.
c. Hãy vi t gi i thu t tìm m c c a nút có khóa k (gi s s k ã có trong cây).
--------------------------------------------------H t-----------------------------------------
Bài gi ng c u trúc d li u và gi i thu t
Trang 69
Bài gi ng c u trúc d li u và gi i thu t
Ch
H4C PH5N C U TRÚC D
LI U VÀ GI I THU T ( 6 S7 16)
Th"i gian làm bài: 90 phút
Trang 2
ng 1
T NG QUAN
V C U TRÚC D
LI U VÀ GI I THU T
Câu 1: (3.0 )
a. Vi t gi i thu t s(p x p dãy n s th c ao, a1, a2,...,an-1 gi m d n theo gi i thu t Quick sort.
b. Cho dãy s : 3 9 6 8 5 4 7
Hãy minh h a quá trình s(p t ng d n dãy s trên theo gi i thu t Quick sort.
c. Ch ng minh gi i thu t Merge sort có
ph c t p O(n log n) v i n là s ph n t c a dãy.
d. Hãy tr l i ng(n g n các câu h"i sau:
- M t cây nh phân có chi u cao h có t i a bao nhiêu nút ?
- M t cây nh phân có chi u cao h có t i a có bao nhiêu nút lá ?
- M t cây nh phân thì * m c i có t i a bao nhiêu nút ?
- Cây nh phân y (m i nút u có 2 cây con) có chi u cao h thì có bao nhiêu nút ?
1.1.BÀI TOÁN
Khái ni m bài toán
•
Trong ph m vi tin h c, ta quan ni m bài toán là m t công vi c nào ó mà ta mu n
•
Khi dùng máy tính gi i bài toán, ta c n quan tâm
máy tính th c hi n.
n ba y u t :
gì (Input), c n l y ra thông tin gì (Output) và quá trình ó
a vào máy thông tin
c x lý nh th nào ?
Ví d v m t s bài toán tin h c
ng trình d ng ax2 + bx + c = 0
•
Gi i ph
Câu 2: (3.0 )
•
Tìm t t c ph
Cho danh sách liên k t n L, m i nút ch a m t phân s g m t s và m%u s (gi s t s và
m%u s c a các phân s là các s nguyên d ng).
a. Hãy nh ngh-a c u trúc d li u danh sách liên k t n bi u di)n các phân s .
b. Vi t gi i thu t tìm phân s có giá tr l n nh t.
c. Vi t gi i thu t m s l ng phân s có giá tr n'm trong kho ng (0,1).
•
Cho dãy n s , tìm dãy con t ng dài nh t (dãy con này có th không g m các ph n t
•
Tính 21000.
Câu 3: (4.0 )
Cho cây nh phân tìm ki m T m i nút ch a m t s nguyên; là khóa c a nút ó.
a. Hãy nh ngh-a c u trúc d li u cho cây T
b. Vi t gi i thu t tính t!ng giá tr các nút trong cây.
c. Vi t gi i thu t m xem cây T có bao nhiêu nút có úng hai con.
d. Vi t gi i thu t in khóa c a các nút trên
ng i t nút g c n nút có khóa k (gi s giá
tr k ã có trong cây).
--------------------------------------------------H t-----------------------------------------
ng án
t n quân h u trên bàn c n x n.
liên ti p nhau).
Các b
c gi i m t bài toán
•
Xác
•
Thi t k gi i thu t
•
Vi t ch
•
Ki m th ch
•
Vi t tài li u (G m: n i dung bài toán, gi i thu t, toàn v n ch
nh bài toán
ng trình
ng trình
ng trình, các b ki m
th , thông tin v các tác gi c a các công o n trên và th i i m ch nh s a cu i cùng
các công o n,…).
1.2.GI I THU T
Khái ni m gi i thu t (thu t gi i/thu t toán)
Gi i thu t gi i bài toán là m t th t c xác
th c hi n
thu
c
u ra cho m t
nh bao g m m t dãy h u h n các b
u vào cho tr
cc n
c c a bài toán.
c tr ng c a gi i thu t
•
•
•
u vào (Input): Gi i thu t nh n d li u vào t m t t p nào ó.
u ra (Output): V i m i t p các d li u u vào, gi i thu t a ra các d li u t
ng v i l i gi i c a bài toán.
Chính xác (Precision): Các b c c a gi i thu t
c mô t chính xác.
ng
Bài gi ng c u trúc d li u và gi i thu t
•
•
•
Trang 3
Bài gi ng c u trúc d li u và gi i thu t
H u h n (Finiteness): Gi i thu t c n ph i a
c u ra sau m t s h u h n (có th
r t l n) b c v i m i u vào.
n tr (Uniqueness): Các k t qu trung gian c a t ng b c th c hi n gi i thu t
c
xác nh m t cách n tr và ch ph thu c vào u vào và các k t qu c a các b c
tr c.
T!ng quát (Generality): Gi i thu t có th áp d ng
c xác
nh nh là l
ng tài nguyên các lo i
•
Có hai lo i tài nguyên quan tr ng ó là th i gian và b nh .
•
Ta
n ánh giá th i gian c n thi t
th c hi n gi i thu t mà ta s#
b'ng m t s quy t(c
c nh p theo th t sau: 7 (g c), 34, 2, 1, 15, 9,
d. Cho dãy ch a n s nguyên a0,a1,…,an-1 ã
c (NLR) và th t sau (LRN)
c s(p t ng và m t s nguyên x. S d ng
qui vi t gi i thu t tìm ki m nh phân.
ph c t p tính toán c a m t gi i thu t b t k$ có th d%n t i nh ng bài toán
ph c t p. Tuy nhiên trong th c t ,
b. Minh h a quá trình bi n !i dãy s 26, 8, 24, 16, 4, 20, 12, 34, 2, 10 thành m t heap.
41, 6, 16, 40, 12, 45. Duy t cây T theo th t tr
g i là th i gian tính c a gi i thu t.
nh
a. Minh h a quá trình s(p t ng d n dãy s 26, 8, 24, 16, 4, 20, 12, 34, 2, 10 theo gi i thu t
c. V# cây nh phân tìm ki m T v i các nút
mà gi i thu t òi h"i s d ng.
xác
Th"i gian làm bài: 90 phút
Merge sort.
ph c t p tính toán c a gi i thu t
c bi t quan tâm
LI U VÀ GI I THU T ( 6 S7 15)
Câu 1: (4 i m)
gi i m i bài toán có d ng ã cho.
ph c t p c a gi i thu t
•
H4C PH5N C U TRÚC D
Trang 68
i v i m t s gi i thu t ta c&ng có th phân tích
c
n gi n là Quy t(c c ng và quy t(c nhân.
e. Cho dãy ch a n s nguyên a0,a1,…,an-1. Vi t gi i thu t s(p dãy s trên theo th t t ng
theo gi i thu t Heap sort.
Câu 2: (3 i m)
a. Cho danh sách liên k t
M t s l p gi i thu t
n L; m i nút ch a m t s nguyên. Hãy
li u cho danh sách liên k t
•
O(1):
H'ng s (constant)
b. Vi t gi i thu t
•
O(log n):
Logarithmic
Câu 3: (3.0 i m)
•
O(n):
Tuy n tính (linear)
•
O(n log n):
Trên tuy n tính (superlinear)
•
O(n2):
Bình ph
•
O(n3):
B c 3 (cubic)
qui
nh ngh-a c u trúc d
n L. Vi t gi i thu t tìm giá tr l n nh t c a danh sách L.
chuy n !i m t s t h
m th p phân sang h
m c s b.
Cho cây nh phân tìm ki m T; m i nút ch a m t s nguyên; là khóa c a nút ó.
a. Hãy
ng (quadratic)
•
O(nk):
a th c (polynomial) (k ≥ 1)
•
O(an):
Hàm m& (exponential) (a > 1)
nh ngh-a c u trúc d li u cho cây T
b. Vi t gi i thu t
m xem cây T có bao nhiêu nút lá ?
c. Vi t gi i thu t tính chi u cao c a cây.
d. Vi t gi i thu t tìm m c c a nút có khóa k (gi s s k ã có trong cây).
--------------------------------------------------H t-----------------------------------------
Bài toán d gi i – khó gi i-không gi i
•
M t bài toán
c
c g i là d) gi i n u nh nó có th gi i
c b*i gi i thu t a th c
(Bài toán tìm dãy con liên ti p có t!ng l n nh t, s(p x p dãy n s ,…)
•
M t bài toán
c g i là khó gi i n u nh nó không th gi i
c b*i gi i thu t a
th c (bài toán li t kê các hoán v c a n s , bài toán li t kê các dãy nh phân chi u dài
n,...). Nh ng bài toán cho
(bài toán cái túi, bài toán ng
•
Bai toán không gi i
n hi n t i v%n ch a tìm
c gi i thu t a th c
gi i
i i du l ch,…)
c n u nh không t n t i gi i thu t
d ng, bài toán v nghi m nguyên c a a th c,…).
gi i (bài toán v tính
Bài gi ng c u trúc d li u và gi i thu t
Trang 67
Bài gi ng c u trúc d li u và gi i thu t
Trang 4
Ví d 1.1. M t s gi i thu t s h c c b n
H4C PH5N C U TRÚC D
LI U VÀ GI I THU T ( 6 S7 14)
a. Ki m tra xem s t nhiên n có ph i là s nguyên t hay không ? (S chính ph
hoàn ch nh, S
Th"i gian làm bài: 90 phút
b. Tìm
Câu 1 (2 ):
c s chung l n nh t c a hai s t nhiên a,b. Tìm b i s chung nh" nh t
c. Tìm USCLN, BSCNN c a n s nguyên d
Hãy vi t hàm
quy( s d ng mã gi )
g n ý t *ng và
hi n th hoán v b n s 1,2,3,4. Hãy trình bày ng(n
ph c t p gi i thu t.
ng, S
i x ng, S Armstrong, S fibonacci).
ng.
d. Phân tích m t s t nhiên n thành tích các th a s nguyên t .
e.
ms l
ng các
c s và tính t!ng các
c s c a m t s t nhiên n.
Câu 2 (2.0 ):
Cho procedure nh sau:
Ví d 1.2.
Procedure P(n,a,b,c,d)
a. Dãy con có t!ng l n nh t
Begin
Cho dãy n s nguyên {a} Dãy con liên ti p là dãy mà thành ph n c a nó là các thành ph n
if n=1 then <chuy n t c c a sang c c c>
liên ti p nhau trong {a}, ta g i t!ng c a dãy con là t!ng t t c các thành ph n c a nó. Tìm
else
t!ng l n nh t trong t t c các t!ng c a các dãy con c a {a}
P(n-1,a,b,c,d);
Ch+ng h n n = 7 s sau:
P(1,a,b,c,d);
4 –5
b.
end
các
Hãy vi t hàm s d ng C/C++ tr n hai danh sách (g m hai thành ph n: Int Inf và ListNode*
c cho b*i hai con tr" head1, head2- s(p x p t ng d n theo tr
t là n và m thành m t danh sách
ng Inf, có
c cho b*i head 3- s(p x p gi m d n theo tr
dài n + m. Hãy trình bày ng(n g n cách tính
dài l n
ph c t p gi i thu t.
o ng
c các ch s c a nó ta
ng (<=1 tri u) sao t!ng các
c th c s c a x b'ng y và t!ng
c th c s c a y b'ng x.
c a chúng là l n nh t.
H
ng d n gi i câu a.
Gi i thu t 1:
c ch y c a gi i thu t s(p x p tr n (Merge sort) cho dãy:
51,20,11,1,10,29,15,6,7.
Hãy vi t ch
-7
d. Cho dãy ch a n s nguyên ai (i=0..n-1), n<=30000, |ai|<=10000. Tìm ba s sao cho tích
ng Inf có
Câu 4 (3.0 ):
Mô t t ng b
3
c s nguyên t ? (Ví d s 5, 13,131 là th"a). (Thu t toán sàng nguyên t )
c. Tìm các s x,y nguyên d
Câu 3 (3.0 ):
l
2
m xem có bao nhiêu s nguyên t <=100 tri u mà khi
c&ng thu
quy khi g i hàm P(4,x,y,z,w)
next) –
–4
Thì k t qu t!ng dãy con c n tìm là 7.
P(n-1,b,d,c,a);
V# cây
6
ng trình s(p x p t ng d n gi i s theo gi i thu t s(p x p tr n.
--------------------------------------------------H t-----------------------------------------
Gi i thu t
L ≤ U ≤ n;
n gi n nh t có th vi t ngay là: xét t t c các c p s nguyên L và U th"a mãn 1 ≤
i v i m i c p nh v y ta tính t!ng c a dãy con a[L..U] và so sánh t!ng này v i
giá tr l n nh t hi n có:
for (L=1;L<=n;L++)
for (U=L;U<=n;U++)
{ sum=0;
for (int I=L;I<=U;I++)
sum=sum+a[I];
maxsofar=max(maxsofar,sum);
}
ch
ng trình này tuy ng(n và d) hi u, tuy nhiên gi i thu t này có
ph c t p là O(n3)
Bài gi ng c u trúc d li u và gi i thu t
Trang 5
Bài gi ng c u trúc d li u và gi i thu t
Trang 66
Gi i thu t 2:
Ta có th c i ti n gi i thu t trên
H4C PH5N C U TRÚC D
ph c t p là O(n2) b'ng cách s d ng
có gi i thu t v i
LI U VÀ GI I THU T ( 6 S7 13)
Th"i gian làm bài: 90 phút
h th c :
T!ng a[L..U]= T!ng a[L..U-1]+a[U]
Câu 1(2 ):
maxsofar=0;
Hãy vi t hàm
for (L=1;L<=n;L++)
m ng và
{
quy (s d ng mã gi )
dài c a nó là tham s
tìm và tr v giá tr ch7n và l n nh t trong m t
u vào c a hàm.
Câu 2(2 ):
sum=0;
Hãy vi t hàm tính t!ng dãy con l n nh t trong m t dãy cho tr
for (U=L;U<=n;U++)
trong m t m ng ) s d ng C/ C++ v i m ng và
{
Trình bày ng(n g n ý t *ng và
sum=sum+a[U];
c (dãy cho tr
dài c a nó là tham s
ph c t p c a gi i thu t. Mô t t ng b
c
c l u tr
u vào c a hàm.
c ch y v i b d
li u sau : 10 -12 2 23 -6 30 20 -13 (bi t r'ng t!ng dãy con l n nh t c a b d li u này là 69).
maxsofar=max(maxsofar,sum);
Câu 3(2 ):
}
Cho procedure nh sau:
}
Procedure P(n,a,b,c,d)
Begin
Gi i thu t 3:
if n=1 then <chuy n t c c a sang c c c>
T!ng l n nh t trong dãy con a[1..i] là t!ng l n nh t trong dãy con a[1..i-1](g i là maxsofar)
ese
ho c t!ng l n nh t trong t t c các t!ng c a các dãy con k t thúc t i i (g i là maxendinghere).
P(n-1,a,b,c,d);
Chúng ta có nh n xét r'ng: Dãy con l n nh t k t thúc t i i là dãy con l n nh t k t thúc t i v
c b! sung thêm ph n t a[i] * cu i ho c là dãy con r ng trong tr
trí i-1
dãy con nh n
P(1,a,b,c,d);
ng h p t!ng c a
P(n-1,b,d,c,a);
c là s âm. Ta có gi i thu t nh sau:
end
maxsofar=0;
maxendinghere=0;
V# cây
for (i=1; i<=n;i++)
Câu 4 (2.0 ):
{
Hãy vi t hàm s d ng C/C++ tr n hai danh sách (g m hai thành ph n: Int Inf và ListNode*
maxendinghere=max(maxendinghere+a[i],0);
next) –
maxsofar=max(maxsofar,maxendinghere);
l
quy khi g i hàm P(4,x,y,z,w)
c cho b*i hai con tr" head1, head2- s(p x p t ng d n theo tr
t là n và m thành m t danh sách-
c cho b*i head 3- s(p x p t ng d n theo tr
dài n+m. Hãy trình bày ng(n g n cách tính
}
1
2
3
4
5
6
7
a[i]
4
-5
6
-4
2
3
-7
maxendinghere
4
0
6
2
4
7
0
maxsofar
4
4
6
6
6
7
7
Gi i thu t 3 này có
dài l n
ng Inf có
ph c t p gi i thu t.
Câu 5 (2.0 ):
Minh h a cho gi i thu t 3:
i
ng Inf có
ph c t p là O(n).
Mô t
t ng b
c ch y c a gi i thu t s(p x p ki u chèn (Insertion sort) cho dãy:
41,10,51,3,1,9,21,6,5.
Hãy vi t ch ng trình s(p x p t ng d n gi i s theo gi i thu t s(p x p chèn.
--------------------------------------------------H t-----------------------------------------
Bài gi ng c u trúc d li u và gi i thu t
Trang 65
Bài gi ng c u trúc d li u và gi i thu t
1.3.GI I THU T
H4C PH5N C U TRÚC D
LI U VÀ GI I THU T ( 6 S7 12)
Th"i gian làm bài: 90 phút
Trang 6
QUI
Gi i thu t
qui là gi i thu t t g i
Phân lo i
quy
n chính mình v i d li u vào có kích th
c nh" h n.
•
Câu 1 (2 i m)
a. Hãy vi t các hàm s(p x p theo gi i thu t chèn tr c ti p và n!i b t.
b. Cho dãy g m các s nguyên sau:
99
52
33
84
Hãy mô ph"ng các b
21
75
68
c s(p x p t ng d n dãy s trên b'ng các gi i thu t chèn tr c ti p và
n!i b t.
Câu 2 (2 i m)
a. Hãy v# l i cây nh phân T bi t khi duy t cây T ta
NLR:
15 1 2 4 7 10 21 3 9 19
LNR:
2 1 7 4 21 10 15 9 19 3
c dãy s sau:
Ví d 1.3.
b. N u ta xóa 1 ph n t kh"i cây BST và sau ó thêm nó vào l i cây. H"i: hình d ng c a cây
ó b thay !i không? Gi i thích?
n
ng án
1.4.C U TRÚC D
ng a và b (có th có hàng ngàn ch s ). S d ng danh sách liên k t
bi u di)n cho s nguyên a và s nguyên b. Hãy vi t hàm tính t!ng a + b.
c. Cho hai danh sách liên k t
vào l3
l3 c&ng
vào l1
l1 sau ó c&ng
n l1,l2 ch a các s nguyên. Hãy tr n các ph n t c a l1 và l2
c s(p x p t ng (hãy l i gi i bài toán b'ng cách chèn các ph n t c a l2
c s(p t ng (l1 ch a các ph n t c a l1 và l2 tr
c ó).
Câu 4 (3 i m)
Cho cây nh phân tìm ki m T, m i nút ch a m t s nguyên. Hãy vi t các hàm th c hi n các
yêu c u sau:
a.
a. Tìm t t c các dãy nh phân chi u dài n.
b. Tìm t t c ph
Câu 3 (3 i m)
c. Cho hai s nguyên d
quy tuy n tính (còn g i là quy n)
M t hàm
c g i là
quy tuy n tính n u m t l n g i hàm nó ch phát sinh t i a
m t l i g i quy.
•
quy nh phân
M t hàm
c g i là
quy nh phân n u m i l n g i hàm nó phát sinh t i a hai l i
g i quy.
•
quy h t ng
Hai hàm P,Q
c g i là
quy h t ng n u hàm P có l i g i n hàm Q và ng c
l i m t cách t ng minh hay ti m ,n.
•
quy phi tuy n ( quy ph c)
M t hàm
c g i là quy phi tuy n n u m i l n g i hàm thì nó phát sinh ra kho ng
n l n g i quy - thông th ng l i g i quy
c t trong các vòng l p.
m các nút là có giá tr > n1 và < n2
b. Xóa t t c các nút mang giá tr là s nguyên t .
--------------------------------------------------H t-----------------------------------------
Ki u d li u
•
•
•
c
t n quân h u trên bàn c n x n.
LI U
c tr ng b*i:
T p các giá tr
Cách bi u di)n d li u
c s d ng chung cho t t c các giá tr này
T p các phép toán có th th c hi n trên t t c giá tr
C u trúc d li u (data structures) là m t h các bi n, có th có các ki u d li u khác nhau,
c liên k t l i theo m t cách th c nào ó. Các c u trúc d li u
•
•
•
C u trúc d li u c s*: int, double, float,…
C u trúc d li u tuy n tính: m ng, danh sách liên k t, ng n x p, hàng
C u trúc d li u phi tuy n: Cây,
th , b ng b m,…
i,…
Ch n c u trúc d li u nào ?
•
•
Bài toán c n gi i quy t có nh ng thao tác nào là th ng xuyên nh t ? T ó mà ch n
c u trúc d li u phù h p.
Tùy theo bài toán mà ch n l a c u trúc d li u thích h p
t i u v th i gian ho c
t i u v b nh .
Ví d 1.4.
a. Tính t!ng, hi u, tích, th ng hai phân s .
b. Cho dãy các phân s (gi s các t s và m%u s c a các phân s là các s nguyên). Tính
t!ng giá tr c a các phân s trong m ng (k t qu là phân s * d ng t i gi n).
c. Cho m ng m t chi u g m n t a
i m (gi s hoành
và tung
c a các i m là các
s nguyên). Tìm m t c p i m g n nhau nh t.
d. Tính t!ng và tích hai a th c P,Q (trên tr ng s nguyên).
e. Tính t!ng hai s nguyên l n A,B (m i s có th có hàng ngàn ch s ).
Bài gi ng c u trúc d li u và gi i thu t
Trang 7
Bài gi ng c u trúc d li u và gi i thu t
Bài t p
Vi t ch
Trang 64
LI U VÀ GI I THU T ( 6 S7 11)
H4C PH5N C U TRÚC D
Th"i gian làm bài: 90 phút
ng trình hoàn ch nh cho các bài toán sau ây
BT1-1.
Cho dãy n s nguyên d ng a0,a1,...,an-1 có giá tr trong ph m vi 0..32767.
a. Tìm ph n t l n nh t (tính t!ng, m s nguyên t , tìm s nguyên t l n nh t,…)
b. Xóa m t ph n t t i v trí th k,
c. Chèn m t ph n t x vào v trí k,
d. Tìm dãy con liên ti p t ng dài nh t.
e. Tìm giá tr l n th k c a dãy.
f. Tìm t n s xu t hi n c a các s .
g. Hãy chuy n k ph n t
u tiên c a dãy v cu i dãy.
BT1-2.Cho hai s nguyên l n a và b; trong ó a có m ch s và s b có n ch s . Vi t ch
Câu 1 (2 i m)
a. Nêu các
nh ngh-a v cách t! ch c danh sách liên k t sau: Danh sách liên k t
n, danh
sách liên k t kép, danh sách liên k t vòng, danh sách có nhi u m i liên k t.
b. Hãy cài
t gi i thu t tìm ki m nh phân b'ng
qui.
c. Hãy cho bi t s l n so sánh c a gi i thu t tìm ki m nh phân trong tr
t t nh t, trung bình. Hãy cho bi t
ng h p x u nh t,
ph c t p c a gi i thu t này.
Câu 2 (2 i m)
ng
S d ng Stack, vi t ch
màn hình s
BT1-3.Vi t ch
Ví d': - Nh p vào m t s nguyên: 10245
ng trình tính n! V i n <=1000
BT1-4.
c cho nh sau :
a. Dãy An
A1=1
An=n(A1+A2+…+An-1)
Vi t hàm tính An có s d ng quy
b. Cho dãy s xn
c nh ngh-a nh sau:
x0 = 1; x1 = 2; xn = nx0 + (n - 1)x1 + … + xn-1
Vi t hàm quy tính xn (v i n ≥ 0).
c. Dãy An
c cho nh sau :
A1=1; A2n=n + An + 2; A2n+1=n2 + An.An+1 +1
Vi t hàm tính An b'ng quy
Viêt hàm tính An b'ng cách không s d ng quy.
BT1-5. t n quân H u lên bàn c Vua sao cho chúng không kh ng ch l%n nhau.
o ng
ng trình nh p vào m t s nguyên, không âm b t k$, sau ó xu t ra
trình th c hi n các phép c ng, tr , nhân, chia (l y ph n nguyên) hai s nguyên l n.
c th t các ch s c a s nh p vào.
- S nguyên * d ng
c: 54201
Câu 3 (3 i m)
a. Cho hai danh sách liên k t
n l1,l2 ch a các s nguyên. Hãy n i danh sách l2 vào sau
danh sách l1.
b. Khai báo m t danh sách liên k t
n trong ó, m i ph n t l u tr d li u g m: Giá tr
c a nút ó (ki u s nguyên) và t n s xu t hi n c a giá tr (ki u s nguyên). Hãy vi t hàm
rút g n danh sách liên k t
n theo d ng sau: N u các ph n t có cùng giá tr thì ch gi
l i m t ph n t và t n s c a giá tr
ó thì
c c ng thêm 1.
Câu 4 (3 i m)
Gi s ta có m t t p h p g m n ph n t ki u s nguyên c n l u tr b'ng c u trúc cây nh phân
tìm ki m (BST). L u ý r'ng các ph n t có th trùng nhau. Hãy trình bày m t
a.
trúc cây BST sao cho:
b.
a. L u tr và tìm ki m
Tìm t t c m i l i gi i khi n=8.
Có bao nhiêu l i gi i khi n=16, n=32 ?
BT1-6.
a. Vi t ch ng trình tìm các dãy hoán v c a n ph n t {1,2,3,…,n}
b. Bài toán tìm t t c các dãy nh phân chi u dài n.
c. Tìm các t! h p ch p k c a n ph n t
d. Tìm các ch nh h p không l p ch p k c a n ph n t .
BT1-7.
a. Tìm các b k s có t!ng b'ng m cho tr c (k,m là các s nguyên d ng).
b. Tìm m t t p con có t!ng l n nh t không l n h n m cho tr c (m là s nguyên d ng).
c. Tìm m t cách chia n s trên thành hai ph n sao cho t!ng các ph n t c a m i ph n chênh
l ch nhau là ít nh t.
o ng
hi n
cs l
c các ph n t . V i các tr
xu t v c u
ng h p ph n t trùng nhau, c n th
ng ph n t trùng l p.
b. Mô t c u trúc b'ng C/C++
c. Vi t hàm cho hai thao tác chính: Thêm ph n t , xóa ph n t .
--------------------------------------------------H t-----------------------------------------
Bài gi ng c u trúc d li u và gi i thu t
Trang 63
Bài gi ng c u trúc d li u và gi i thu t
Ch
LI U VÀ GI I THU T ( 6 S7 10)
H4C PH5N C U TRÚC D
Trang 8
ng 2
TÌM KI M VÀ S P X P
Th"i gian làm bài: 90 phút
Câu 1 (2 i m)
a. Nêu các
2.1.PH
NG PHÁP TÌM KI M
nh ngh-a sau: Cây nhi phân, cây nh phân tìm ki m, cây nh phân cân b'ng hoàn
2.1.1.Bài toán tìm ki!m
toàn, cây nh phân cân b'ng.
b. b.Hãy cài
t gi i thu t tìm ki m tuy n tính
c. Hãy cho bi t s l n so sánh c a gi i thu t tìm ki m tuy n tính trong tr
t t nh t, trung bình. Hãy cho bi t
ng h p x u nh t,
ph c t p c a gi i thu t này.
Câu 2 (2 i m)
Vi t các hàm sau ây:
Cho dãy n s nguyên a0,a2,...,an-1 và m t s nguyên x. Hãy tìm xem x có thu c vào dãy s trên
hay không ? N u tìm
c * v trí th i thì xu t k t qu là i, ng c l i n u không tìm th y thì
xu t k t qu là –1 (chú ý dãy b(t u t ch s 0, n u dãy có nhi u s b'ng x thì xu t v trí i
nh" nh t).
Sau ây là hai gi i thu t tìm ki m th ng
c s d ng nh t.
a. Thêm m t ph n t x vào stack S b'ng cách dùng danh sách liên k t.
2.1.2.Tìm ki!m tuy!n tính
b. Xem thông tin c a ph n t *
B(t u t ph n t th nh t a[0], ta l n l t so sánh x v i các giá tr a[i]. N u có a[i] b'ng x
thì i chính là k t qu c n tìm và k t thúc gi i thu t. N u trong dãy không có s a[i] nào b'ng x
nh stack S b'ng cách dùng danh sách liên k t.
c. Thêm m t ph n t x vào cu i hàng
d. Xem thông tin c a ph n t *
i Q b'ng cách dùng danh sách liên k t.
u hàng
i Q b'ng cách dùng danh sách liên k t.
Câu 3 (3 i m)
Cho m t danh sách liên k t
n trong ó, m i ph n t ch a m t s nguyên
a. Vi t hàm xóa t t c các s nguyên t trong danh sách.
b. Hãy tìm t n s xu t hi n c a các giá tr .
Câu 4 (3 i m)
Cho cây nh phân tìm ki m T có khóa là các s nguyên.
a. Vi t hàm tìm m c c a m t nút có giá tr x.
b. Vi t hàm in các nút * m c k c a cây.
--------------------------------------------------H t-----------------------------------------
thì xu t k t qu là –1 và c&ng k t thúc gi i thu t.
int LinearSearch ( int a[], int n, int x )
{
int i = 0;
while ( i
i++;
if( i==n)
return -1; // tìm h t nh ng không có x
return i; //
tìm th y a[i] là ph n t có khóa x
}
Hi u qu c a gi i thu t
c nâng cao b'ng cách t thêm ph n t c m canh (sentinel)
* cu i m ng (a[n]=x) b o m r'ng trong dãy a[i] lúc này luôn có ph n t b'ng x và vòng
l p while luôn k t thúc. Do ó không c n ki m tra i u ki n (i
int LinearSearch ( int a[], int n, int x )
{int i = 0; // m ng g m n ph n t t a[0]...a[n-1]
a[n] = x; // thêm ph n t th n+1
while (a[i]!=x)
i++;
if( i==n)
return -1; // tìm h t nh ng không có x
return i; // tìm th y x t i v trí i
}
Gi i thu t tìm ki m tuy n tính có
ph c t p tính toán là O(n).
Bài gi ng c u trúc d li u và gi i thu t
Trang 9
Bài gi ng c u trúc d li u và gi i thu t
Trang 62
2.1.3.Tìm ki!m nh" phân
(v i ph
ó là th t không gi m).
Gi s dãy tìm ki m hi n hành bao g m các ph n t aleft,…,ar ght.
G i midle=(left+right)/2
Nh n xét r'ng n u x > a[i] thì x ch có th xu t hi n bên ph i a[i] - ngh-a là trong
o n [amidle+1, aright] c a dãy, ng c l i n u x < a[i] thì x ch có th xu t hi n bên trái a[i] trong o n [aleft, amidle-1] c a dãy, nh v y gi i thu t s# thu g n ph m vi tìm ki m m t cách
áng k . M i l n so sánh lo i
c m t n a thông tin không có ích.
Ví d 2.1: Cho dãy s
1
3
4
5
6
7
8
9
10 12
C n tìm ph n t x=3
B c 1: left=0, right=9, mid=4, a[mid]= 6
Do x < a[mid] nên right=3.
Do left<=right ti p t c qua b c 2.
B c 2: left=0, right=3, mid=1, a[mid]= 3
Do x = a[mid] nên v trí c n tìm là mid =1.
Gi s c n tìm ph n t x=11
B c 1: left=0, right=9, mid=4, a[mid]= 6
Do x > a[mid] nên left=5.
Do left<=right ti p t c qua b c 2.
B c 2: left=5, right=9, mid=7, a[mid]= 9
Do x > a[mid] nên left=8.
Do left<=right ti p t c qua b c 3.
B c 3: left=8, right=9, mid=8, a[mid]= 10
Do x > a[mid] nên left=9.
Do left<=right ti p t c qua b c 4.
B c 4: left=9, right=9, mid=9, a[mid]= 12
Do x < a[mid] nên right=8.
Do left> right vòng l p k t thúc và k t qu tr v là -1
Cài %t theo ki u quy
int BinarySearch_Recursive(int a[],int n,int x,int left,int right)
{ if (left>right) return -1;
int mid=(left+right)/2;
if (x==a[mid]) return mid;
if (x
return BinarySearch_Recursive(a,n,x,left,mid-1);
return BinarySearch_Recursive(a,n,x,mid+1,right);
}
LI U VÀ GI I THU T ( 6 S7 9)
H4C PH5N C U TRÚC D
ng pháp tìm ki m nh phân thì dãy n s a0,a1,a2,..,an-1 ph i có th t - gi s
Th"i gian làm bài: 90 phút
Câu 1 (2 i m)
a. Hãy
nh ngh-a m t heap và nêu các tính ch t c a m t heap
b. Hãy hi u ch nh dãy s sau ây thành m t heap
12
2
8
5
1
6
4
15
Câu 2 (2 i m)
a. Hãy vi t hàm s(p x p ch n tr c ti p b'ng cách s d ng danh sách liên k t
n.
Yêu c u thay !i các m i liên k t (thao tác trên vùng next).
b. B'ng các thao tác c b n trên hàng
i sau ây, hãy vi t hàm tính t!ng các ph n t c a
m ng m t chi u n ph n t .
int Qisempty(List Q) :
ki m tra hàng
void Qpush(List &Q, int x)
:Thêm m t ph n t vào cu i hàng
int Qpop(List &Q)
Trích/h y ph n t * âu hàng
:
i r ng
i
i
Câu 3 (3 i m)
a. Cho m t danh sách liên k t
nguyên x vào danh sách l
n l ch a các s nguyên ã có th t t ng. Hãy chèn m t s
l v%n có th t t ng.
b. b.Cho m t danh sách liên k t
n l ch a các s nguyên. Hãy gi l i m t giá tr trong các
giá tr trùng nhau c a l.
Câu 4 (3 i m)
a. Hãy vi t ph n khai báo c u trúc d li u
mô t m t danh sách liên k t
n l mà m i
ph n t là m t s nguyên. Hãy vi t hàm s(p x p các ph n t trong danh sách l theo chi u
t ng d n.
b. Hãy vi t ph n khai báo c u trúc d li u
mô t m t cây nh phân tìm ki m mà m i ph n
t là m t s nguyên. Hãy vi t hàm tìm chi u cao c a cây.
--------------------------------------------------H t-----------------------------------------
Bài gi ng c u trúc d li u và gi i thu t
H4C PH5N C U TRÚC D
Trang 61
LI U VÀ GI I THU T ( 6 S7 8)
Th"i gian làm bài: 90 phút
Câu 1 (2 i m)
Hãy vi t hàm s(p x p danh sách t ng d n b'ng cách thay !i m i liên k t.
Câu 2 (2 i m)
Hãy vi t các hàm tìm ki m m t ph n t x trong các tr
Danh sách c n tìm
ng h p:
c bi u di)n b'ng m t m ng m t chi u, danh sách c n tìm
di)n b'ng m t danh sách liên k t
n, danh sách c n tìm
c bi u
c bi u di)n b'ng m t cây nh
phân tìm ki m.
(Các hàm này n u tìm th y tr v giá tr 1, n u không tìm th y tr v giá tr 0).
Câu 3 (3 i m)
a. Cho m t danh sách liên k t
n trong ó, m i ph n t ch a m t s nguyên. Hãy vi t hàm
xóa ph n t có giá tr l n nh t trong danh sách (l u ý: Ch
l n và n u có nhi u ph n t l n nh t gi ng nhau, xóa ph n t
c phép duy t danh sách m t
u tiên).
b. Dùng ng n x p các s nguyên v i các phép toán push,pop. Hãy l p ch
ng trình !i m t
Bài gi ng c u trúc d li u và gi i thu t
Trang 10
Cài %t theo ki u không quy
int BinarySearch(int a[],int n,int x)
{
int left=0,right=n-1,mid;
do
{
mid=(left+right)/2;
if (x==a[mid])
return mid;
else
if (x
right=mid -1;
else
left=mid+1;
}
while (left<=right);
return -1;
}
Gi i thu t tìm ki m nh phân có ph c t p tính toán là O(log2n)
s th p phân thành s nh phân.
2.2.PH
Câu 4 (3 i m)
Cho cây nh phân tìm ki m T có khóa là các s nguyên.
NG PHÁP S#P X P
2.2.1.Bài toán s$p x!p
a. Li t kê t t c các ph n t c a m t cây nh phân tìm ki m th"a i u ki n giá tr c a ph n t
n'm trong kho ng [Min, Max] cho tr
c.
b. Tìm cây con T có t!ng l n nh t (ch tìm m t cây th"a)
--------------------------------------------------H t-----------------------------------------
Cho m t dãy n s , hãy s(p x p dãy s theo th t t ng d n (ho c gi m d n).
Trong bài gi ng này gi thi t r'ng khi nói m t dãy có th t ngh-a là dãy ó có th t không
gi m.
Ví d dãy ban u :
S1 = {5 6 1 9 8 6}
Dãy sau khi bi n !i:
S2 = {1 5 6 6 8 9}
•Khái ni m ngh ch th
Xét m t m ng n s a0, a1,.., an-1. N u có i < j và ai > aj, thì ta g i ó là m t ngh ch th .
M ng ch a s(p x p s# có ngh ch th , và ng c l i m ng ã có th t s# không ch a ngh ch
th .
s(p x p m t m ng, ta có th tìm cách làm gi m s các ngh ch th trong m ng này
b'ng cách hoán v các ph n t ai,aj n u có i < j và ai > aj theo m t quy lu t nào nào ó.
Sau ây là m t s ph ng pháp s(p x p th ng dùng nh t.
2.2.2.Ph ng pháp %i ch% tr&c ti!p
Ý t *ng chính c a gi i thu t !i ch tr c ti p là xu t phát t
u dãy, tìm t t c
ngh ch th ch a ph n t này, tri t tiêu chúng b'ng cách !i ch ph n t này v i ph n t t ng
ng trong c p ngh ch th . L p l i quá trình trên v i các ph n t ti p theo trong dãy.
Bài gi ng c u trúc d li u và gi i thu t
Trang 11
Bài gi ng c u trúc d li u và gi i thu t
Ví d 2.2:
Cho dãy s 5 6 1 9 8 6
Thì k t qu t ng b c nh sau:
H4C PH5N C U TRÚC D
Trang 60
LI U VÀ GI I THU T ( 6 S7 7)
Th"i gian làm bài: 90 phút
dòng
i
j
a[0]
a[1]
a[2]
a[3]
a[4]
a[5]
0
0
2
5
6
1
9
8
6
Cho cây nh phân tìm ki m T g m 12 s nguyên v i th t các nút
1
1
2
1
6
5
9
8
6
sau: 11 (nút g c), 7, 5, 1, 6, 8, 10, 9, 18, 12, 13, 19.
2
3
4
1
5
6
9
8
6
3
3
5
1
5
6
8
9
6
4
4
5
1
5
6
6
9
8
1
5
6
6
8
9
5
Câu 1 (2 i m)
c chèn vào cây nh
a. Hãy v# cây nh phân tìm ki m T.
b. Hãy duy t cây T trên theo th t NLR.
c. Hãy duy t cây T trên theo th t RNL.
d. Hãy v# l i cây sau khi xoá nút 11 sao cho T v%n là cây nh phân tìm ki m.
Câu 2 (2 i m)
void interchangesort(int a[], int n)
{
for (int i=0; i
for (int j=i+1;j
if (a[i]>a[j])
swap(a[i],a[j]);
}
a. Hãy nêu s khác nhau c a cây nh phân tìm ki m (BST) và Heap?
b. Có th li t kê n ph n t c a heap theo th t t ng d n v i chi phí O(n) không? Vì sao?
Câu 3 (3 i m)
Cho danh sách liên k t
là các s nguyên d
n l, m i nút là m t phân s (gi s t s và m%u s c a các phân s
ng). C u trúc c a danh sách liên k t l
c cho nh sau:
struct Phanso {int tu; int mau;};
ph c t p tính toán c a gi i thu t là: O(n2)
2.2.3.Ph
struct Node {Phanso info; struct Node *next;};
struct List
ng pháp ch n tr&c ti!p
Ch n ph n t nh" nh t trong n ph n t kh*i t o, a ph n t này v v trí úng là u
dãy hi n hành; sau ó không quan tâm n nó n a, xem dãy hi n hành m i ch còn n-1 ph n
t c a dãy ban u, b(t u t v trí th hai; l p l i quá trình trên cho dãy hi n hành... cho
khi dãy hi n hành ch còn m t ph n t .
n
a. Hãy
ms l
ng phân s có giá tr l n h n 1 c a danh sách l.
b. Hãy t o danh sách l1 ch ch a các phân s t i gi n t danh sách l (phân s t i gi n là phân
s mà
c.
Ví d 2.3:
Cho dãy s 5 6 1 9 8 6
N u dãy c n
c s(p theo th t t ng d n,
{Node *head,*tail;};
Hãy vi t các hàm th c hi n các yêu c u sau:
c s chung l n nh t c a t s và m%u s c a nó b'ng 1).
ms l
ng phân s t i gi n c a danh sách l (phân s t i gi n là phân s mà
chung l n nh t c a t s và m%u s c a nó b'ng 1).
Câu 4 (3 i m)
Hãy vi t ph n khai báo c u trúc d li u
dòng
i
j
a[0]
a[1]
a[2]
a[3]
a[4]
a[5]
0
0
2
5
6
1
9
8
6
là m t s nguyên d
mô t m t cây nh phân tìm ki m mà m i ph n t
ng. Hãy vi t các hàm th c hi n các yêu c u sau:
1
1
2
1
6
5
9
8
6
a. Vi t hàm
2
2
2
1
5
6
9
8
6
b. Vi t hàm tính t!ng các nút có giá tr nguyên t trong cây.
3
3
5
1
5
6
9
8
6
4
4
4
1
5
6
6
8
9
1
5
6
6
8
9
5
cs
m xem trong cây có bao nhiêu nút có úng 2 cây con ?
--------------------------------------------------H t-----------------------------------------
Bài gi ng c u trúc d li u và gi i thu t
H4C PH5N C U TRÚC D
Trang 59
Bài gi ng c u trúc d li u và gi i thu t
void selectionsort(int a[],int n)
{
for(int i = 0;i < n -1; i++)
{
int min = i;
for ( int j = i+1; j < n; j++)
if (a[j] < a[min])
min = j;
swap( a[min], a[i] );
}
}
ph c t p tính toán c a gi i thu t là: O(n2)
LI U VÀ GI I THU T ( 6 S7 6)
Th"i gian làm bài: 90 phút
Câu 1 (2 i m)
Hãy v# cây nh phân tìm ki m T bi t r'ng khi duy t cây T theo th t
left – right - node thì
c dãy nh sau: 1, 4, 7, 5, 3, 16, 18, 15, 29, 25, 30, 20, 8
a. Hãy duy t cây T trên theo th t
node - left - right.
b. Cây T có chi u cao là bao nhiêu ? Tìm các
ng i t g c có
dài là 4 trên cây.
Câu 2 (2 i m)
a. Trong gi i thu t Quick sort c b n, ph n t pivot
c ch n là: pivot=a[r]. Hãy cho bi t
u/khuy t i m c a cách ch n này.
b. V i cách ch n pivot=a[(l+r)/2], hãy cho bi t chi phí c n thi t
quick sort s(p x p m t
m ng g m có n ph n t b'ng nhau.
Câu 3 (3 i m)
Hãy khai báo ki u d li u danh sách liên k t
viên bao g m các tr
n mà m i ph n t ch a thông tin v m t sinh
ng: mã s sinh viên (chu i, 12 ký t ), h lót sinh viên (chu i, t i a 12
ký t ), tên sinh viên (chu i, t i a 12 ký t ), i m trung bình tích l&y (s th c).
2.2.4.Ph
Ví d 2.4:
Cho dãy s 5 6 1 9 8 6
N u dãy c n
c s(p theo th t t ng d n,
dòng
j-1
j
a[0]
a[1]
a[2]
a[3]
a[4]
a[5]
0
4
5
5
6
1
9
8
6
1
3
4
5
6
1
9
6
8
2
1
2
5
6
1
6
9
8
3
0
1
5
1
6
6
9
8
4
4
5
1
5
6
6
9
8
1
5
6
6
8
9
a.Hàm x p lo i t t nghi p cho sinh viên. Trong ó x p lo i X(xu t s(c) n u có i m trung
bình tích l&y ( TB) >=9.0; Lo i G(Gi"i) n u có i m trung bình tích l&y 8<= ( TB)<9.0;
TB < 8; Lo i T (trung bình) n u có iêm
trung bình tích l&y 5<= TB <7.
b.Hàm s(p x p danh sách theo i m trung bình tích l&y.
c.Hàm s(p x p danh sách
t lo i X, danh sách c n
ng pháp n%i b t (Bubble Sort)
Xu t phát t cu i dãy (ho c u dãy), !i ch b t k$ hai ph n t k c n nào ng c th
t
a ph n t nh" nh t (ho c l n nh t) trong các c p ph n t ó v v trí úng là u
(cu i) dãy hi n hành, k ti p không xét n nó n a * b c ti p theo, do v y * l n x lý th i
s# có v trí u dãy là i. L p l i quá trình trên cho n khi không còn c p ph n t nào xét.
V i các ki u d li u v a khai báo, hãy xây d ng các hàm sau:
Lo i K(khá) n u có i m trung bình tích l&y 7<=
Trang 12
5
c s(p theo tên t ng d n, n u tên trùng
thì s(p theo h t ng d n.
void bubblesort(int a[],int n)
Câu 4 (3 i m)
{
Gi s T là m t cây nh phân tìm ki m mà t i m i nút l u m t s nguyên. Hãy khai báo ki u
for (int i=1;i
d li u T và xây d ng các hàm sau:
for (int j=n-1;j>=i;j--)
if (a[j]
a. Hàm thêm m t node có khóa X vào T.
b. Hàm
swap(a[j],a[j-1]);
m s nút có khóa l n h n X nh ng nh" h n Y (X < Y).
}
--------------------------------------------------H t----------------------------------------*Ph
ph c t p tính toán c a gi i thu t là: O(n2)
ng pháp này trong th c t không
c khuy n khích s d ng.
Bài gi ng c u trúc d li u và gi i thu t
Trang 13
Bài gi ng c u trúc d li u và gi i thu t
Trang 58
2.2.5.S$p x!p chèn tr&c ti!p
Dãy
u tiên ch có m t th t a0 là dãy ã
c s(p. Ta t ng b
c m* r ng dãy
s(p b'ng cách l n l t thêm ph n t ai (i=1..n-1) vào. Khi chèn ai vào dãy ã
c s(p thì ta
l u giá tr c n chèn. Th hai tìm v trí
ti n hành các công o n sau: Th nh t là t x=ai
pos thích h p trong o n a0 n ai-1 chèn ai vào. Th ba là chèn x vào v trí pos.
dòng
pos+1
i
a[0]
a[1]
a[2]
a[3]
a[4]
a[5]
0
1
1
5
6
1
9
8
6
1
0
2
5
6
1
9
8
6
2
3
3
1
5
6
9
8
6
3
3
4
1
5
6
9
8
6
4
3
5
1
5
6
8
9
6
1
5
6
6
8
9
void insertionsort(int a[], int n)
{
int pos,x;
for(int i=1; i
{
x=a[i]; pos=i-1;
while(pos>=0 && a[pos]>x)
a[pos+1] = a[pos--];
a[pos+1]=x;
}
}
Th"i gian làm bài: 90 phút
Câu 1 (2 i m)
I
0
1
2
3
4
5
6
7
8
9
A[i]
5
1
2
8
6
10
3
9
4
7
-Hãy cho bi t k t qu sau khi hi u ch nh m ng A thành (binary) heap?
-V# (binary) heap * d ng cây nh phân.
b.Cho bi t s ph n t t i thi u và t i a c a m t (binary) heap có chi u cao là h ?
Câu 2 (2 i m)
a. Hãy minh h a cách s(p x p t ng d n dãy s sau ây theo gi i thu t Quick sort:
28, 9, 25, 19, 5, 21, 14, 31.
b. Ch ng minh gi i thu t merge sort có
ph c t p là O(n log2n)
Câu 3 (3 i m)
Cho danh sách liên k t
c. Hãy
n, m i nút là m t phân s (t s và m%u s là các s nguyên)
m xem trong danh sách có bao nhiêu phân s có giá tr l n h n 1.
d. Hãy xóa các phân s không ph i là phân s t i gi n trong danh sách.
Câu 4 (3 i m)
Cho cây nh phân tìm ki m T có khóa là các s nguyên.
a. In các khóa theo chi u gi m d n.
b. Tìm giá tr nút lá * m c sâu nh t (ch tìm 1 giá tr th"a)
ph c t p tính toán c a gi i thu t là: O(n2)
2.2.6.S$p x!p phân ho ch (Quick sort)
Quick Sort
c th c hi n b'ng cách phân ho ch dãy ã cho thành hai ph n sau ó
s(p các ph n này riêng bi t nhau nh sau:
t
LI U VÀ GI I THU T ( 6 S7 5)
a.Cho m ng A ch a các ph n t :
Ví d 2.5:
Cho dãy s 5 6 1 9 8 6
N u dãy c n
c s(p theo th t t ng d n,
5
H4C PH5N C U TRÚC D
c
u tiên ch n ph n t tùy ý; th ng
c ch n là x=a[(l+r)/2] làm m c, k ti p quét
u trái c a m ng cho n khi g p m t ph n t l n h n x và quét t
u ph i c a m ng cho
n khi g p m t ph n t bé h n x, hai ph n t d ng vi c quét d- nhiên là không úng ch
trong m ng k t qu cu i cùng nên ph i hoán v chúng.
Sau khi th c hi n b c này thì b o m r'ng t t c các ph n t * bên trái c a x s# nh"
h n x và các ph n t bên ph i c a x s# l n h n x.
Sau b c này ta ã chia dãy thành hai dãy con; ta l i ti p t c phân ho ch theo ki u
qui cho m i dãy con này.
--------------------------------------------------H t-----------------------------------------
Bài gi ng c u trúc d li u và gi i thu t
H4C PH5N C U TRÚC D
Trang 57
LI U VÀ GI I THU T ( 6 S7 4)
Th"i gian làm bài: 90 phút
Bài gi ng c u trúc d li u và gi i thu t
Trang 14
Ví d 2.6:
Cho dãy s 5 6 1 9 8 6
N u dãy c n
c s(p theo th t t ng d n,
dòng
l
r
x
a[0]
a[1]
a[2]
a[3]
a[4]
a[5]
0
0
5
1
5
6
1
9
8
6
Câu 1 (2 i m)
1
0
1
1
1
6
5
9
8
6
a. N u ta xóa m t ph n t kh"i cây BST và sau ó thêm nó vào l i cây. H"i: hình d ng c a
2
1
5
9
1
6
5
9
8
6
3
1
4
5
1
6
5
6
8
9
4
2
4
6
1
5
6
6
8
9
5
3
4
6
1
5
6
6
8
9
6
4
5
8
1
5
6
6
8
9
1
5
6
6
8
9
cây ó b thay !i không? Gi i thích?
h
b. Ch ng minh r'ng m t cây nh phân v i chi u cao h s# có t i a 2 -1 nút.
Câu 2 (2 i m)
a. S d ng Stack, vi t ch
ng trình chuy n !i m t s nguyên n trong h th p phân (h 10)
sang bi u di)n h nh phân (h 2).
b. Hãy áp d ng gi i thu t Balan ng
c
bi n !i bi u th c sau thành d ng postfit:
(a+b/(c-d))*e. Trình bày tr ng thái c a stack sau m i l n có s thay !i.
Câu 3 (3 i m)
Hãy qu n lý các s thuê bao i n tho i b'ng danh sách liên k t
thông tin: h tên,
a ch , s
Hãy vi t hàm tìm ki m
i n tho i c
a ch c a m t s
n. M i ph n t ch a các
i n tho i cho tr
c.
Cho cây nh phân tìm ki m T, m i nút ch a m t s nguyên. Hãy vi t các hàm th c hi n các
yêu c u sau:
ng i t g c
{
int x=a[(l+r)/2]; int i=l;int j=r;
do
{
while (a[i]
while (a[j]>x) j--;
nh.
Câu 4 (3 i m)
a. In
7
void quicksort(int a[],int l,int r)
n nút có giá tr l n nh t.
b. Tìm m t cây con không ch a s nguyên t nào.
--------------------------------------------------H t-----------------------------------------
if (i<=j)
swap(a[i++],a[j--]);
}
while (i
if (l
if (i
}
ph c t p tính toán c a gi i thu t là: O(n log n)
2.2.7.S$p x!p vun
ng (Heap sort)
tìm ph n t nh" nh t * b c i, ph ng pháp s(p x p ch n tr c ti p ã không t n
d ng
c các thông tin ã có
c do các phép so sánh * b c i-1. Ph ng pháp Heap Sort
kh(c ph c
c nh c i m này.
nh ngh a heap:
Gi s xét tr ng h p s(p x p t ng d n, khi ó Heap
c
nh ngh-a là m t dãy các ph n t
al,..,ar thoã các quan h sau v i m i i∈ [l,r]
ai ≥ a2i
ai ≥ a2i+1
(ai,a2i), (ai,a2i+1) là các c p ph n t liên
i
Bài gi ng c u trúc d li u và gi i thu t
Trang 15
Tính ch t c a heap:
Tính ch t 1: N u al,.,ar là m t Heap thì khi c(t b" m t s ph n t * hai u c a Heap thì
dãy con còn l i v%n là m t Heap .
Tính ch t 2: N u các ph n t a1,..,an là m t Heap thì ph n t a1 ( u heap) luôn là ph n t
l n nh t trong Heap.
Tính ch t 3: M i dãy al,al+1,…,ar v i 2l > r là m t Heap
•Gi i thu t
Giai o n 1:
Giai o n 2:
B c 1:
LI U VÀ GI I THU T ( 6 S7 3)
H4C PH5N C U TRÚC D
Th"i gian làm bài: 90 phút
Câu 1 (2 i m)
a. Vi t hàm cài
t gi i thu t Selection-Sort b'ng
qui và không
qui.
Câu 2 (2 i m)
Hi u ch nh dãy s ban u thành Heap
S(p x p dãy s d a trên Heap
a ph n t l n nh t v v trí ng * cu i dãy
Vi t gi i thu t d ng mã gi
c 2: Lo i b" ph n t l n nh t ra kh"i Heap r=r-1;
Hi u ch nh ph n còn l i c a dãy t al n ar thành m t Heap.
c 3:N u r >1 ( heap còn ph n t ) : l p l i b
Ng c l i: d ng
chuy n các ph n t trong stack S1 sang stack S2 v i nh ng yêu
c u nh sau:
r = n;
Hoán v (a1,ar)
B
Trang 56
b. Hãy cho bi t s l n so sánh và s l n gán c a gi i thu t Selection-Sort.
Gi i thu t heap sort g m hai giai o n sau:
B
Bài gi ng c u trúc d li u và gi i thu t
c2
•
Th t các ph n t trong S2 gi ng nh trong S1
•
Không
c dùng thêm stack ph , ch
c dùng thêm vài bi n ph .
Câu 3 (3 i m)
a. Cho hai danh sách liên k t
n l1,l2 có các ph n t là các s nguyên và ã
c m t danh sách l3 c&ng
d n. Hãy tr n hai danh sách này
c s(p t ng
c s(p t ng d n (không
c s(p x p).
D a vào tính ch t 3, ta có th th c hi n giai o n 1 b'ng cách b(t
u t heap m c nhiên
an/2+1, an/2+2,…,an, l n l t thêm vào các ph n t an/2, an/2-1,…,a1. ta s# nh n
c Heap
theo mong mu n. Nh v y gi i o n 1 t ng
ng v i n/2 l n th c hi n b c 2 c a giai
o n 2.
i v i các thao tác c b n. Hãy vi t các hàm th c hi n các công vi c sau
ây:
-L y ra ph n t cu i cùng c a hàng
-L y ra ph n t th n c a hàng
(gi i thu t này minh h a theo d ng cây thì ng
void insertheap(int a[],int l,int r)
i
c d) hình dung h n).
Cài
i
i, v i n là s nguyên d
ng.
t c th các gi i thu t trên b'ng ng n x p các s nguyên v i cách t! ch c hàng
i b'ng danh sách liên k t.
Câu 4 (3 i m)
{
int j;
Cho cây nh phân tìm ki m T, m i nút ch a m t s nguyên. Hãy vi t các hàm th c hi n các
j=l*2;
while (j<=r)
yêu c u sau:
{
if (j
if (a[j]
if (a[j] <=a[l])
swap(a[l],a[j]);
output(a,n);
l=j;
j=l*2;
}
}
b. Cho m t hàng
a. In ra t t c các nút * m c th k c a cây T
j++;
return;
b. In ra t t c các nút theo th t t ng 0
n t ng th h-1 c a cây T (h là chi u cao c a cây)
--------------------------------------------------H t-----------------------------------------
Bài gi ng c u trúc d li u và gi i thu t
Trang 55
H4C PH5N C U TRÚC D
LI U VÀ GI I THU T ( 6 S7 2)
Th"i gian làm bài: 90 phút
Câu 1 (2 i m)
a. Vi t hàm s(p x p dãy n s nguyên ao, a1, a2,...,an-1 t ng d n theo gi i thu t Quick sort.
b. Hãy minh h a cách s(p x p t ng d n dãy s sau ây theo gi i thu t Quick sort:
28, 9, 25, 19, 5, 21, 14, 31.
Câu 2 (2 i m)
Cho m t m ng các giá tr nguyên nh sau:
i
0
1
2
3
4
5
6
7
8
9
a[i]
10
3
16
7
1
4
9
14
2
8
a. Cho bi t k t qu sau khi bi n !i m ng trên thành dãy heap.
Bài gi ng c u trúc d li u và gi i thu t
Trang 16
void heapsort(int a[],int n)
{
int l=n/2;
int r=n;
while (l>0)
insertheap(a,l--,r);
while (r>0)
{
swap(a[1],a[r]);
output(a,n);
r--;
insertheap(a,1,r);
}
}
ph c t p tính toán c a gi i thu t là: O(nlog2n)
b. Th hi n dãy heap ó theo d ng cây nh phân.
2.2.8.S$p x!p tr n (Merge sort)
Câu 3 (3 i m)
Hãy khai báo ki u c u trúc d li u liên k t
quy n sách bao g m các tr
n mà m i ph n t ch a thông tin v m t
ng: Mã s sách (s nguyên 4 byte), tên sách (chu i, t i a 40 ký
t ), tác gi (chu i, t i a 30 ký t ), n m xu t b n (s nguyên 4 byte).
a.
m s sách xu t b n n m X.
b. S(p x p danh sách theo mã s sách.
Câu 4 (3 i m)
Gi s T là m t cây nh phân tìm ki m mà t i m i nút l u m t s nguyên. Hãy khai
báo ki u d li u T và xây d ng các hàm sau:
a. Hàm tìm ki m m t node có khóa X (tr v con tr" tr" d n nút tìm
b. Hàm
B
c 1: Chu,n b
k=1;// k là chi u dài c a dãy con trong b c hi n hành
B c 2:Tách dãy a0,a1,…an-1 thành hai dãy b,c theo nguyên t(c luân phiên t ng nhóm k ph n
t .
B c 3:Tr n t ng c p dãy con g m k ph n t c a hai dãy b,c vào dãy a.
B c 4:
k=k*2;
N u k
Ng c l i: D ng
c).
m s nút có khóa l n h n X.
c. Hãy tìm cây con có t!ng l n nh t.
--------------------------------------------------H t-----------------------------------------
ph c t p tính toán c a gi i thu t là: O(nlog2n)
Ví d 2.7:
Cho dãy s
8
Dãy c n
5
1
3
6
c s(p theo th t t ng d n,
9
12
4
7
10
9
4
12
7
k=1;
B c tách a thành b,c
Dãy b: 8
Dãy c: 5
1
3
6
9
12
4
7
10
Tr n : 5
8
1
3
6
10
Bài gi ng c u trúc d li u và gi i thu t
Trang 17
Bài gi ng c u trúc d li u và gi i thu t
Trang 54
k=2;
B c tách a thành b,c
Dãy b: 5
8
6
Dãy c: 1
3
4
9
12
7
10
Tr n : 1
8
4
6
3
5
M TS
9
12
7
10
H4C PH5N C U TRÚC D
THI M U
LI U VÀ GI I THU T ( 6 S7 1)
Th"i gian làm bài: 90 phút
k=4;
B c tách a thành b,c
Dãy b: 1
3
5
8
7
10
Dãy c: 4
Tr n : 1
12
5
6
8
6
3
9
4
Câu 1 (2 i m)
a. Vi t hàm s(p x p dãy n s nguyên ao,a1,a2,...,an-1 t ng d n theo gi i thu t Heap sort.
9
12
7
10
k=8;
b. Hãy minh h a cách s(p x p t ng d n dãy s sau ây theo gi i thu t Heap sort:
26, 7, 22, 15, 1, 18, 11, 27
B c tách a thành b,c
Dãy b: 1
3
4
Dãy c: 7
10
Tr n : 1
3
4
5
6
8
9
Câu 2 (2 i m)
12
Cho cây nh phân tìm ki m T g m 12 s nguyên v i phép duy t LRN cho k t qu nh sau: 1,
5
6
7
8
9
10
12
3, 2, 6, 7, 5, 4, 10, 9, 12, 11, 8
a. Hãy v# cây nh phân tìm ki m T.
b. Duy t cây T theo th t NLR
Ví d 2-8. Cho dãy n s nguyên sau:
Hãy mô ph"ng các b
c s(p x p t ng d n dãy s trên theo các gi i thu t s(p x p ã h c
c. V# l i cây sau khi xoá nút 8 sao cho T v%n cây nh phân tìm ki m.
Câu 3 (3 i m)
8
5
1
3
6
9
12
4
7
10
Ví d 2-9.
Cho dãy n s nguyên ai.
a. Vi t hàm tìm xem x có thu c dãy ai hay không ? N u có tr v 1, n u không có tr v 0.
b. Vi t hàm tìm giá tr l n nh t, l n th nhì c a dãy.
c. Tìm các giá tr xu t hi n nhi u l n nh t
Cho m t danh sách liên k t
n l; m i nút là m t s nguyên d
ng.
a. Vi t hàm t o danh sách l1 ch ch a các s nguyên t t danh sách l.
b. Vi t hàm xóa các s nguyên t trong danh sách l.
Câu 4(3 i m)
Cho cây nh phân tìm ki m T; m i nút là m t s nguyên.
a. Vi t hàm tìm m c c a nút có giá tr l n nh t.
Ví d 2-10.
Cho dãy n s nguyên d
b. Vi t hàm tìm t t c các
ng ai.
c. Vi t hàm
a. Hãy s(p các s nguyên t v
u dãy, các s khác v cu i dãy.
b. Hãy cho bi t k giá tr khác nhau l n nh t c a dãy.
c. Vi t hàm tìm giá tr l n th k c a dãy.
CÁC PH./NG PH0P S0P X1P
2C BI3T tham kh o thêm t i [2] trang 199
ng i t g c có
dài là 4 trên cây.
m s cây con ch ch a toàn là s nguyên t .
--------------------------------------------------H t-----------------------------------------
Bài gi ng c u trúc d li u và gi i thu t
Trang 53
BÀI T P
Bài gi ng c u trúc d li u và gi i thu t
Trang 18
BÀI T P
BT4-1.Cho cây nh phân tìm ki m T, m i nút ch a m t s nguyên. Hãy vi t các hàm th c
BT2-1. Cho dãy n s nguyên a0,a1,…,an-1.
hi n các yêu c u sau:
a. Chèn nút vào cây, duy t cây theo các th t
L p trình hoàn ch nh các gi i thu t ã trình bày trong ch
ãh c
b.
m xem trong cây có bao nhiêu nút có giá tr âm? bao nhiêu nút có giá tr d
c.
m xem trong cây có bao nhiêu nút lá ? nút nhánh ? nút có 1 cây con ? nút có 2 cây con?
d. Tìm ph n t d
ng?
ng nh" nh t c a cây.
i. In
ng i t g c
ng i t g c có
BT2-2.Cho dãy n s nguyên a0,a1,…,an-1
b. S(p x p các ph n t t ng d n theo t!ng các ch s c a t ng ph n t .
l ch c a cây.
g. In ra t t c các nút * m c th k c a cây T.
h. Tìm t t c các
m
a. Hãy cho bi t v trí c a k ph n t có giá tr l n nh t c a dãy.
e. Tìm m c c a nút có giá tr l n nh t.
f. Cho bi t chi u cao c a cây,
ng này và gi i thu t s(p x p
(2 gi i thu t tìm ki m và 8 gi i thu t s(p x p).
c. Tìm h ng c a các ph n t (s l n có h ng cao) theo cách (xem ví d ). Ví d dãy s 3 2 2
dài là k trên cây.
5 5 6 4 6 thì x p h ng là 6 7 7 3 3 1 5 1
n nút có giá tr l n nh t.
BT4-2.Cho cây nh phân tìm ki m T, m i nút ch a m t s nguyên. Hãy vi t các hàm th c
hi n các yêu c u sau:
BT2-3.Cho hai t p X và Y; m i t p g m n s nguyên và s nguyên k. H"i có tìm
cm ts
x thu c X và m t s y thu c Y sao cho x + y = k hay không ?
a. Chèn ph n t x vào cây.
BT2-4.Cho dãy n s nguyên không âm và s nguyên k. H"i dãy ã cho có ch a hai s v i
b. Xóa ph n t có giá tr x trong cây.
t!ng là b'ng k hay không ? N u có hãy
BT4-3.Gi s ta có m t t p h p g m n ph n t ki u s nguyên c n l u tr b'ng c u trúc cây
BT2-5.Cho m ng g m n s nguyên.
nh phân tìm ki m (BST). L u ý r'ng các ph n t có th trùng nhau. Vi t ch
ng trình hoàn
a ra hai s
ó (n <=106, k<=109).
a. Tìm m ng g m các ph n t riêng bi t (gi l i m t s trong các s trùng nhau).
ch nh cho hai thao tác chính: Thêm ph n t , xóa ph n t .
BT4-4.Xây d ng c u trúc cây sao cho m i nút c a cây l u tr
m t phân s
b. Tìm hai s g n nhau nh t trong m ng ã cho
(t s và m%u s là các s nguyên).
BT2-6.Cho hai file ch a các s nguyên ã
a. Hãy tìm phân s có giá tr l n nh t
m t file c&ng
b. Tính t!ng giá tr các phân s trong cây.
BT2-7.Cho dãy n s nguyên (yêu c u
BT4-5. Cho cây nh phân tìm ki m T; m i nút là m t s nguyên.
a.
c s(p t ng d n.
ph c t p tuy n tính).
a. Trình bày gi i thu t tìm ph n t trung v c a dãy.
m xem trong cây có bao nhiêu nút mà gia tr c a nó cùng v i giá tr c a hai cây con
b. Trình bày gi i thu t tìm ph n t có giá tr th k c a dãy.
tr c ti p c a nó c&ng là s nguyên t ?
b. Tìm cây con T có t!ng l n nh t (chi tìm m t cây th"a).
c.
c s(p t ng d n, hãy tr n hai file này
m s cây con ch ch a toàn là s nguyên t .
BT4-6.Cho m t cây nh phân bi u di)n m t bi u th c toán h c. Bi t r'ng g c c a cây là root,
m i nút có thu c tính key (ki u char) , ch a m t phép tính(+,- , *,/) hay m t giá tr nguyên
(các nút lá). Hãy vi t hàm tính giá tr bi u th c ch a trong cây.
BT4-7.Vi t ch
ng trình qu n lý m t danh b
thuê bao, h tên ch thuê bao,
xóa i m t s thuê bao nào ó.
a ch . Ch
i n tho i
n gi n bao g m các thông tin: s
ng trình cho phép tìm ki m thông tin, thêm ho c
c
Bài gi ng c u trúc d li u và gi i thu t
Ch
Trang 19
Bài gi ng c u trúc d li u và gi i thu t
Ví d 4.7
3ng i trên cây
//------------In các nút trên
ng i t g c
void duongditugoc(tree root, int x)
{
ng 3
DANH SÁCH LIÊN K T
Trong ph n l p trình C, b n c ã
c gi i thi u các ki u d li u c s* nh : ki u s , ki u
ký t ho c các ki u d li u có c u trúc n gi n nh : ki u m%u tin, ki u m ng. Các i t ng
c bi u di)n b*i các ki u d li u này có kích th c không !i trong su t quá trình s ng c a
nó –g i là các ki u d li u t-nh. Tuy nhiên m t i t ng trong quá trình s ng c a nó có th
thay !i
l n; khi ó n u dùng các ki u d li u t-nh
bi u di)n thì vi c gi i quy t v n
tr* nên ph c t p, không
c t nhiên và không hi u qu . Trong ch ng 3 này, chúng tôi gi i
thi u m t cách th c t! ch c d li u linh ng h n nh'm kh(c ph c
c các khuy t i m trên
– ó là c u trúc d li u ng – mà d ng n gi n và quan tr ng nh t là danh sách liên k t.
3.1.DANH SÁCH LIÊN K T (LINK LIST)
3.1.1.Ð"nh ngh'a
ki u T
Cho T là m t ki u
c nh ngh-a tr c, ki u danh sách Tx g m các ph n t thu c
c nh ngh-a là: Tx = <Vx, Ox> ,trong ó:
c móc n i v i nhau theo trình t tuy n
Vx = {t p h p có th t các ph n t ki u T
tính};
Ox = {t o danh sách; Tìm m t ph n t trong danh sách; chèn m t ph n t vào danh
sách; hu4 m t ph n t kh"i danh sách ; li t kê các ph n t c a danh sách, s(p
x p danh sách,...}
3.1.2.Các hình th c t% ch c danh sách
Có nhi u ki u t! ch c liên k t gi a các ph n t trong danh sách nh
-Danh sách liên k t n
-Danh sách liên k t kép,…
:
Hình th c liên k t này cho phép các thao tác thêm, hu4 ph n t trên danh sách
th c hi n d) dàng h n, ph n ánh
c b n ch t linh ng c a danh sách.
Trang 52
n nút có giá tr x----------
if (timkiem01(root,x))
{
while (root->info!=x)
{
cout<<root->info<<" ->";
if (root->info>x)
root=root->left;
else
if (root->info
root=root->right;
}
cout<<root->info;
}
else
cout<<"Khong co duong di tu goc den "<
}
//In
ng i t g c n nút có m c sâu nh t
void duongdidennucsaunhat(tree root)
{
if (root!=NULL)
{
duongdidennucsaunhat(root->right);
if (muccuanut(root1,root->info)==chieucao(root1)-1)
duongditugoc(root1,root->info);
duongdidennucsaunhat(root->left);
}
}
c
CÂY NH; PHÂN TÌM KI1M CÂN B
3.2.DANH SÁCH LIÊN K T
3.2.1.T% ch c danh sách
N
n theo cách c p phát liên k!t
C u trúc d li u c a m t ph n t trong danh sách n:
M i ph n t c a danh sách n là m t c u trúc ch a hai thông tin :
-Thành ph n d li u: l u tr các thông tin v b n thân ph n t .
trang 230
B=NG B>M tham kh o thêm t i [2] trang 249
Bài gi ng c u trúc d li u và gi i thu t
Trang 51
Hàm xoanut tr v giá tr 1, 0 khi h y thành công ho c không có k trong cây:
H y toàn b CNPTK
Vi c toàn b cây có th
c th c hi n thông qua thao tác duy t cây theo th t sau. Ngh-a là
ta s# h y cây con trái, cây con ph i r i m i h y nút g c.
//--------Hàm tìm ph n t th m ng-----------------------void phantuthemang(tree &p,tree &q)
{
if (q->left) phantuthemang(p,q->left);
else
{
p->info=q->info;
p=q;
q=q->right;
}
}
//---------------Xóa nút có giá tr là k---------------------int xoanut(tree &root,int k)
{
if (root==NULL)
return 0;
if (root->info>k)
return xoanut(root->left,k);
if (root->info
return xoanut(root->right,k);
else
{
node *p=root;
if (root->right==NULL)
root=root->left;
else
if (root->left==NULL)
root=root->right;
else
{
node *q=root->right;
phantuthemang(p,q);
}
delete(p);
}
return 1;
}
Bài gi ng c u trúc d li u và gi i thu t
Trang 20
-Thành ph n m i liên k t: l u tr
a ch c a ph n t k ti p trong danh sách, ho c l u tr
giá tr NULL n u là ph n t cu i danh sách.
Ta có nh ngh-a t!ng quát
struct Node
{
Data Info;//data là ki u d li u ã nh ngh-a tr
Node* Next;//con tr" ch n c u trúc Node
c
};
M t ph n t trong danh sách n là m t bi n ng s#
c yêu c u c p phát khi c n. Và
danh sách n chính là s liên k t các bi n ng này v i nhau do v y t
c s linh
ng khi thay !i s l ng các ph n t .
• N u bi t
c a ch c a ph n t
u tiên trong danh sách n thì có th d a vào thông
tin next c a nó
truy xu t n ph n t th hai trong xâu, và l i d a vào thông tin next
c a ph n t th 2
truy xu t n ph n t th 3,...Ngh-a là qu n lý m t xâu n ch
c n bi t a ch ph n t
u xâu. Th ng m t con tr" head s#
c dùng
l u tr
a
ch ph n t
u xâu, ta g i head là u xâu. Ta có khai báo:
Node
*head;
• Tuy v nguyên t(c ch c n qu n lý xâu thông qua
u xâu head, nh ng th c t có nhi u
tr ng h p c n làm vi c v i ph n t cu i xâu, khi ó m i l n mu n xác nh ph n t cu i
xâu l i ph i duy t t
u xâu. Ð ti n l i, có th s d ng thêm m t con tr" tail gi
a
ch ph n t cu i xâu. Khai báo tail nh sau :
Node *tail;
•
3.2.2. Các thao tác c b n trên danh sách
Gi s có các
n
nh ngh-a:
struct node
{
int
info;
node *next;
};
struct list
{
list
node
};
head,tail;
*head,*tail;
Và ã xây d ng th t c t onút (getnode(x))
v i thông tin ch a trong x:
t o ra m t ph n t cho danh sách
Bài gi ng c u trúc d li u và gi i thu t
Trang 21
node* taonut (int x)
{
p=new node;
if (p==NULL)
exit(1);
p->info=x;
p->next=NULL;
return p;
}
•
c tr" b*i con tr" new_elelment vào danh sách:
Gi i thu t :
n u danh sách r ng thì
l.head = new_elelment;
l.tail = new_elelment;
ng
cl i
p->next = l.head;
}
//In các nút c a cây theo t ng m c t m c 0 m c h-1 (v i h là chi u cao c a cây)
void duyetnuttheotungmuc(tree root)
{
int h=chieucao(root);
for (int i=0;i
{
duyetnutmuck(root,i);
cout<
}
}
//--------------- l ch c a cây--------------int dolech(tree root)
{
return abs(chieucao(root->left) - chieucao(root->right));
}
Ví d 4.6: Xóa nút trên cây
Vi c h y m t ph n t k ra kh"i cây ph i b o
tr ng h p khi h y nút k có th x y ra:
l.head = new_elelment;
void
{
chennutvaodau(List &l,Node *p)
•
•
if (l.head==NULL)
{
•
l.head=p; // new_elelment nh mô t trên
l.tail=p;
Tr
Tr
}
else
Tr
{ p->next=l.head;
l.head=p;
}
m i u ki n ràng bu c c a CNPTK. Có 3
k là nút lá.
k ch có 1 con (trái ho c ph i).
k có
c 2 con
ng h p th nh t:
Ch
n gi n h y k vì nó không móc n i n ph n t nào khác.
ng h p th hai:
Tr c khi h y k ta móc n i cha c a k v i con duy nh t c a nó.
ng h p cu i cùng:
Ta không th h y tr c ti p do k có
2 con
Ta s# h y gián ti p. Thay vì h y k, ta
s# tìm m t ph n t th m ng k’. Ph n t này có t i a m t con. Thông tin l u t i k’ s#
chuy n lên l u t i k. Sau ó, nút b h y th t s s# là k’ gi ng nh 2 tr ng h p
V n là ph i ch n k’ sao cho khi l u k’ vào v trí c a k, cây v%n là CNPTK.
}
Nh v y
Trang 50
cout<<root->info<<" ";
duyetnutmuck(root->right,k);
}
3.2.2.1.Chèn m t ph(n t vào danh sách:
Có 3 lo i thao tác chèn m t ph n t x
Chèn vào u danh sách
Bài gi ng c u trúc d li u và gi i thu t
t o m t danh sách b'ng cách chèn
u ta có th vi t hàm nh sau:
c
u.
Có 2 ph n t th"a mãn yêu c u:
•
Ph n t nh" nh t (trái nh t) trên cây con ph i.
• Ph n t l n nh t (ph i nh t) trên cây con trái.
Vi c ch n l a ph n t nào là ph n t th m ng hoàn toàn ph thu c vào ý thích c a ng i l p
trình. : ây, chúng tôi s# ch n ph n t (ph i nh t trên cây con trái làm phân t th m ng.
Bài gi ng c u trúc d li u và gi i thu t
Trang 49
Bài gi ng c u trúc d li u và gi i thu t
int demnut2connt(tree root)
{
if (root==NULL) return 0;
else
{
if (root->left!=NULL && root->right!=NULL && nguyento(root->info) &&
nguyento(root->left->info) && nguyento(root->right->info))
return 1+demnut2connt(root->left)+demnut2connt(root->right);
return demnut2connt(root->left)+demnut2connt(root->right);
}
}
void danhsachchendau(List &l)
{
int x,n;
cout<<"Nhap vao so n = ";cin>>n;
for (int i=1;i<=n;i++)
{
cin>>x;
chennutvaodau(l,taonut(x));
}
}
Ví d 4.5: Chi u cao c a cây, m c c a nút
//---------------Chi u cao c a cây--------------int chieucao(tree root)
{
if (root==NULL) return 0;
else
{
long hl=chieucao(root->left);
long hr=chieucao(root->right);
return 1+((hl
}
}
//---------------Tìm m c c a nút có giá tr là x---------------int muccuanut(tree root, int x)
{
if (root!=NULL)
{
if (root->info==x) return 0;
if (root->info>x)
return 1+muccuanut(root->left,x);
if (root->info
return 1+muccuanut(root->right,x);
}
return 0;
}
//---------------In các nút * m c k c a cây--------------void duyetnutmuck(tree root, int k)
{
if (root!=NULL)
{
duyetnutmuck(root->left,k);
if (muccuanut(root1,root->info)==k)
Chèn new_elelment vào cu i danh sách
•
Gi i thu t :
N u danh sách r ng thì
l.head = new_elelment;
l.tail = head;
ng c l i
l.tail ->next = new_elelment;
l.tail = new_elelment ;
Cài t
void
{
Trang 22
chennutvaocuoi(List &l,Node *p)
if (l.head==NULL)
{
l.head=p;
l.tail=p;
}
else
{
l.tail->next=p;
l.tail=p;
}
}
Nh v y
t o m t danh sách b'ng cách chèn cu i ta có th vi t hàm nh sau:
Bài gi ng c u trúc d li u và gi i thu t
Trang 23
void danhsachchencuoi(List &l)
{
int x,n;
cout<<"Danh sach co bao nhieu phan tu : ";cin>>n;
for (int i=1;i<=n;i++)
{
cin>>x;
chennutvaocuoi(l,taonut(x));
}
}
Chèn vào danh sách sau m t ph n t q
•
Gi i thu t :
N u ( q != NULL) thì
new_ele -> next = q->next;
q->next = new_ele ;
void chensaunutq(List &l,Node *q,int x)
{
Node *p=taonut(x);
if (p==NULL) exit(1);
if (q!=NULL)
{
p->next=q->next;
q->next=p;
if (q==l.tail)
l.tail=p;
}
else
chennutvaodau(l,p);
}
3.2.2.2. Tìm m t ph(n t trong danh sách
n
Gi i thu t :
Xâu n òi h"i truy xu t tu n t , do ó ch có th áp d ng gi i thu t tìm tuy n tính
xác nh ph n t trong xâu có khoá k. S d ng m t con tr" ph tr p
l n l t tr" n
các ph n t trong xâu. Gi i thu t
c th hi n nh sau :
•
Bài gi ng c u trúc d li u và gi i thu t
Trang 48
//--------------- m s nút có úng m t cây con --------------int demnut1caycon(tree root)
{
if (root==NULL) return 0;
else
{
if ((root->left!=NULL && root->right==NULL) ||
(root->left==NULL && root->right!=NULL))
return 1+demnut1caycon(root->left)+demnut1caycon(root->right);
return demnut1caycon(root->left)+demnut1caycon(root->right);
}
}
//--------------- m s nút có hai cây con--------------int demnut2caycon(tree root)
{
if (root==NULL) return 0;
else
{
if (root->left!=NULL && root->right!=NULL)
return 1+demnut2caycon(root->left)+demnut2caycon(root->right);
return demnut2caycon(root->left)+demnut2caycon(root->right);
}
}
int nguyento(int n)
{
if (n<2) return 0;
int k=sqrt(n);
for (int i=2;i<=k;i++)
if (n%i==0) return 0;
return 1;
}
//---------------- m xem có bao nhiêu nút có giá tr nguyên t ?---------------int demnutnguyento(tree root)
{
if (root==NULL) return 0;
return nguyento(root->info)+demnutnguyento(root->left)+demnutnguyento(root->right);
}
//---------------Dem so nut co dung 2 cay con
u là s nguyên t ---------------
Bài gi ng c u trúc d li u và gi i thu t
Trang 47
L u ý: Hãy vi t l i hàm trên b'ng cách không s d ng ph ng pháp quy.
Ki m tra xem k có trong cây root hay không ? N u có thì tr v giá tr 1; n u không có thì tr
v giá tr 0.
int timkiem01(tree root,int k)
{
if (root==NULL)
return 0;
else
if (root->info==k)
return 1;
if (k>root->info)
return timkiem01(root->right,k);
else
return timkiem01(root->left,k);
}
D) dàng th y r'ng s l n so sánh t i a ph i th c hi n tìm ph n t k là h, v i h là chi u cao
c a cây. Nh v y thao tác tìm ki m trên CNPTK có n nút t!ng chi phí trung bình kho ng
O(log2n) .
Ví d 4.4:
2ng d ng phép duy t cây
//----------Tính t!ng giá tr c a các nút trong cây ---------int tong(tree root)
{
if (root==NULL) return 0;
return root->info+tong(root->left)+tong(root->right);
}
//-----------------Tìm giá tr l n nh t c a cây ----------int giatrilonnhat(tree root)
{
while (root->right!=NULL)
root=root->right;
return root->info;
}
//------------ m s nút c a cây---------------int demnut(tree root)
{
if (root==NULL)
return 0;
return demnut(root->left)+demnut(root->right)+1;
}
//------------- m s nút lá c a cây------------int demnutla(tree root)
{
if (root==NULL) return 0;
if ((root->left==NULL) && (root->right==NULL)) return 1;
else return demnutla(root->left)+demnutla(root->right);
}
Bài gi ng c u trúc d li u và gi i thu t
Trang 24
B
c 1:
p = Head; //Cho p tr" n ph n t
u danh sách
B c 2:
Trong khi (p != NULL) và (p->next != k ) th c hi n:
p:=p->next;// Cho p tr" t i ph n t k
c 3:
N u p != NULL thì p tr" t i ph n t c n tìm
Ng c l i: không có ph n t c n tìm.
Cài t:
Node* Search(List l,int x)
{
p=l.pH;
while ((p!=NULL)&&(p->Info!=x))
p=p->next;
return p;
}
B
3.2.2.3. Duy t danh sách
Duy t danh sách là thao tác th ng
c th c hi n khi có nhu c u x lý các ph n t c a
danh sách theo cùng m t cách th c ho c khi c n l y thông tin t!ng h p t các ph n t c a
danh sách nh :
Ð m các ph n t c a danh sách,
-
Tìm t t c các ph n t thoã i u ki n,
Hu4 toàn b danh sách (và gi i phóng b nh )
Ð duy t danh sách (và x lý t ng ph n t ) ta th c hi n các thao tác sau:
•
Gi i thu t :
B
B
c 1:
p = Head; //Cho p tr"
n ph n t
u danh sách
c 2:
Trong khi (Danh sách ch a h t) th c hi n
B21 : X lý ph n t p;
B22 : p:=p->pNext;
// Cho p tr" t i ph n t k
Cài t:
void ProcessList(List &l)
{
p=l.pH;
while (p!=NULL)
{
cout<
Info<<" ";
p=p->pNext;
}
cout<}