You are on page 1of 13

u trúc d li u và gi i thu t

Ch ng 7. u trúc cây

7.1. nh ngh a cây


nh ngh a 1: cây là m t t p h p T các ph n t (g i là nút c a cây) trong ó có 1
nút c bi t c g i là g c, các nút còn l i c chia thành nh ng t p r i nhau T1, T2 ,
... , Tn theo quan h phân c p trong ó Ti c ng là m t cây. M i nút c p i s qu n lý
m t s nút c p i+1. Quan h này ng i ta còn g i là quan h cha-con.
nh ngh a 2: c u trúc cây v i ki u c s T là m t nút c u trúc r ng c g i là
cây r ng (NULL). M t nút mà thông tin chính c a nó có ki u T, nó liên k t v i m t s
h u h n các c u trúc cây khác c ng có ki u c s T. Các c u trúc này c g i là nh ng
cây con c a cây ang xét.
v B c c a m t nút: là s cây con c a nút ó .
v B c c a m t cây: là b c l n nh t c a các nút trong cây (s cây con t i a c a
m t nút thu c cây). Cây có b c n thì g i là cây n-phân.
v Nút g c: là nút không có nút cha.
v Nút lá: là nút có b c b ng 0 .
v Nút nhánh: là nút có b c khác 0 và không ph i là g c .
v M c c a m t nút:
M c (g c (T) ) = 0.
G i T1, T2, T3, ... , Tn là các cây con c a T0
M c (T1) = M c (T2) = ... = M c (Tn) = M c (T0) + 1.
v dài ng i t g c n nút x: là s nhánh c n i qua k t g c n x.
v R ng cây: là t p h p nhi u cây trong ó th t các cây là quan tr ng.
Ví d :
− t ch c c a m t công ty , m t t ch c
− M c l c m t quy n sách
− C u trúc cây th m c
− C u trúc th vi n, …
v Nh n xét:
− Trong c u trúc cây không t n t i chu trình
− T ch c 1 c u trúc cây cho phép truy c p nhanh n các ph n t c a nó.

7.2. Cây nh phân (Binary Tree)


Cây nh phân là cây mà m i nút có t i a 2 cây con
Trong th c t th ng g p các c u trúc có d ng cây nh phân. M t cây t ng quát có
th bi u di n thông qua cây nh phân.

Ch ng 7. C u trúc cây Trang 75


u trúc d li u và gi i thu t

Cây nh phân có th ng d ng trong nhi u bài toán thông d ng. Ví d d i ây cho


ta hình nh c a m t bi u th c toán h c:

v M t s tính ch t c a cây nh phân:


− S nút n m m c I ≤ 2I.
− S nút lá ≤ 2h-1, v i h là chi u cao c a cây.
− Chi u cao c a cây h ≥ log2(s nút trong cây).
− S nút trong cây ≤ 2h-1.

7.2.1. Bi u di n cây nh phân T


Cây nh phân là m t c u trúc bao g m các ph n t (nút) c k t n i v i nhau theo
quan h “cha-con” v i m i cha có t i a 2 con. bi u di n cây nh phân ta ch n
Ch ng 7. C u trúc cây Trang 76
u trúc d li u và gi i thu t
ph ng pháp c p phát liên k t. ng v i m t nút, ta dùng m t bi n ng l u tr các
thông tin:
− Thông tin l u tr t i nút.
− a ch nút g c c a cây con trái trong b nh .
− a ch nút g c c a cây con ph i trong b nh .
struct node {
DATA key; //Data là ki u d li u ng v i thông tin l u t i nút
struct node *pLeft, *pRight;
};
typedef struct node NODE;
typedef NODE * TREE;
v Kh i t o cây:
void init(TREE &tree) {
tree=NULL;
}
Do tính ch t m m d o c a cách bi u di n b ng c p phát liên k t, ph ng pháp này
c dùng ch y u trong bi u di n cây nh phân. T ây tr i, khi nói v cây nh phân,
chúng ta s dùng ph ng pháp bi u di n này.

7.2.2. Duy t cây nh phân


N u nh khi kh o sát c u trúc d li u d ng danh sách liên k t ta không quan tâm
nhi u n bài toán duy t qua t t c các ph n t c a chúng thì bài toán duy t cây h t s c
quan tr ng. Nó là c t lõi c a nhi u thao tác quan trong khác trên cây. Do cây nh phân là
m t c u trúc d li u phi tuy n nên bài toán duy t cây là bài toán không t m th ng.
Có nhi u ki u duy t cây khác nhau, và chúng c ng có nh ng ng d ng khác nhau.
i v i cây nh phân, do c u trúc qui c a nó, vi c duy t cây ti p c n theo ki u qui
là h p lý và n gi n nh t. Sau ây chúng ta s xem xét m t s ki u duy t thông d ng.
Có 3 ki u duy t chính có th áp d ng trên cây nh phân: duy t theo th t tr c
(NLR), th t gi a (LNR) và th t ï sau (LRN). Tên c a 3 ki u duy t này c td a
trên trình t c a vi c th m nút g c so v i vi c th m 2 cây con.
v Duy t theo th t tr c (Node-Left-Right)
Ki u duy t này tr c tiên th m nút g c sau ó th m các nút c a cây con trái r i n
cây con ph i. Th t c duy t có th trình bày n gi n nh sau:
void NLR(TREE Root) {
if (Root != NULL) {
ProcessNode(Root); // X lý nút
NLR(Root->pLeft); // Duy t cây con trái
NLR(Root->pRight); // Duy t cây con ph i

Ch ng 7. C u trúc cây Trang 77


u trúc d li u và gi i thu t
}
}
v Duy t theo th t gi a (Left- Node-Right)
Ki u duy t này tr c tiên th m các nút c a cây con trái sau ó th m nút g c r i n
cây con ph i. Th t c duy t có th trình bày n gi n nh sau:
void LNR(TREE Root) {
if (Root != NULL) {
LNR(Root->pLeft); // Duy t cây con trái
ProcessNode(Root); // X lý nút
LNR(Root->pRight); // Duy t cây con ph i
}
}
v Duy t theo th t sau (Left-Right-Node)
Ki u duy t này tr c tiên th m các nút c a cây con trái sau ó th m n cây con
ph i r i cu i cùng m i th m nút g c. Th t c duy t có th trình bày n gi n nh sau:
void LRN(TREE Root) {
if (Root != NULL) {
LRN(Root->pLeft); // Duy t cây con trái
LRN(Root->pRight); // Duy t cây con ph i
ProcessNode(Root); // X lý nút
}
}
Trong ó: ProcessNode (NODE* p) là hàm x lý m t nút trên cây.
M t ng d ng quan tr ng khác c a phép duy t cây theo th t sau là vi c tính toán
giá tr c a bi u th c d a trên cây bi u th c nh hình d i:

(3 + 1)×3/(9 – 5 + 2) – (3×(7 – 4) + 6) = –13


Ch ng 7. C u trúc cây Trang 78
u trúc d li u và gi i thu t

7.2.3. Bi u di n cây t ng quát b ng cây nh phân


Nh c m c a các c u trúc cây t ng quát là b c c a các nút trên cây có th dao
ng trong m t biên l n ⇒ vi c bi u di n g p nhi u khó kh n và lãng phí. H n n a,
vi c xây d ng các thao tác trên cây t ng quát ph c t p h n trên cây nh phân nhi u. Vì
v y, th ng n u không quá c n thi t ph i s d ng cây t ng quát, ng i ta chuy n cây
t ng quát thành cây nh phân.
Ta có th bi n i m t cây b t k thành m t cây nh phân theo qui t c sau:
− Gi l i nút con trái nh t làm nút con trái.
− Các nút con còn l i chuy n thành nút con ph i.
− Nh v y, trong cây nh phân m i, con trái th hi n quan h cha con và con ph i
th hi n quan h anh em trong cây t ng quát ban u.
Ví d :

Gi s có cây t ng quát Cây nh phân t ng ng

7.3. Cây nh phân tìm ki m


Cây nh phân tìm ki m (CNPTK) là cây nh phân trong ó t i m i nút, khóa c a
nút ang xét l n h n khóa c a t t c các nút thu c cây con trái và nh h n khóa c a t t
c các nút thu c cây con ph i.
Ví d :

Ch ng 7. C u trúc cây Trang 79


u trúc d li u và gi i thu t

Nh ràng bu c v khóa trên CNPTK, vi c tìm ki m tr nên có nh h ng. H n


n a, do c u trúc cây vi c tìm ki m tr nên nhanh áng k . N u s nút trên cây là N thì
chi phí tìm ki m trung bình ch kho ng log2N.
v Duy t cây
Thao tác duy t cây trên cây nh phân tìm ki m hoàn toàn gi ng nh trên cây nh
phân. Ch có m t l u ý nh là khi duy t theo th t gi a, trình t các nút duy t qua s
cho ta m t dãy các nút theo th t t ng d n c a khóa.
v Tìm m t ph n t x trong cây
NODE* searchNode(TREE T, DATA X) {
if (T != NULL) {
if (T->key == X) return T;
if (T->key > X)
return searchNode(T->pLeft, X);
else
return searchNode(T->pRight, X);
}
return NULL;
}
Ta có th xây d ng m t hàm tìm ki m t ng ng không qui nh sau:
NODE * searchNode(TREE Root, DATA x) {
NODE *p = Root;
while (p != NULL) {
if(x == p->key) return p;
else
if(x < p->key)
p = p->pLeft;
else
p = p->pRight;
Ch ng 7. C u trúc cây Trang 80
u trúc d li u và gi i thu t
}
return NULL;
}
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 X 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 n chi phí trung
bình kho ng O(log2n) .
Ví d : Tìm ph n t 55

v Thêm m t ph n t x vào cây


Vi c thêm m t ph n t X vào cây ph i b o m u ki n ràng bu c c a CNPTK.
Ta có th thêm vào nhi u ch khác nhau trên cây, nh ng n u thêm vào m t nút lá s là
ti n l i nh t do ta có th th c hiên quá trình t ng t thao tác tìm ki m. Khi ch m d t
quá trình tìm ki m c ng chính là lúc tìm c ch c n thêm.
Hàm insert tr v giá tr –1, 0, 1 khi không b nh , g p nút c hay thành công:
int insertNode(TREE &T, DATA X) {
if (T != NULL) {
if (T->key == X) return 0; // ã có nút ch a d li u X
if (T->key > X)
return insertNode(T->pLeft, X);
else
return insertNode(T->pRight, X);
}
T = new NODE;
if (T == NULL) return -1; // thi u b nh
T->key = X;
T->pLeft =T->pRight = NULL;
return 1; // thêm vào thành công
}
Ví d : Thêm ph n t 50
Ch ng 7. C u trúc cây Trang 81
u trúc d li u và gi i thu t

v H y m t ph n t có khóa x
Vi c h y m t ph n t X ra kh i cây ph i b o m u ki n ràng bu c c a
CNPTK.
Có 3 tr ng h p khi h y nút X có th x y ra:
− X là nút lá.
− X ch có 1 con (trái ho c ph i).
− X có c 2 con
o Tr ng h p th nh t: ch n gi n h y X vì nó không móc n i n ph n t
nào khác.

o Tr ng h p th hai: tr c khi h y X ta móc n i cha c a X v i con duy nh t


c a nó.

Ch ng 7. C u trúc cây Trang 82


u trúc d li u và gi i thu t

o Tr ng h p cu i cùng: ta không th h y tr c ti p do X có 2 con ⇒ Ta s


h y gián ti p. Thay vì h y X, ta s tìm m t ph n t th m ng Y. Ph n t này có
t i a m t con. Thông tin l u t i Y s c chuy n lên l u t i X. Sau ó, nút b
h y th t s s là Y gi ng nh 2 tr ng h p u.
V n là ph i ch n Y sao cho khi l u Y vào v trí c a X, cây v n là CNPTK.
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.
Hãy xem ví d d i ây hi u rõ h n:

Sau khi h y ph n t X=18 ra kh i cây tình tr ng c a cây s nh trong hình d i


ây (ph n t 23 là ph n t th m ng):
Hàm delNode tr v giá tr 1, 0 khi h y thành công ho c không có X trong cây:
int delNode(TREE &T, DATA X) {
if (T==NULL) return 0;
if (T->key > X)

Ch ng 7. C u trúc cây Trang 83


u trúc d li u và gi i thu t
return delNode (T->pLeft, X);
else if(T->key < X)
return delNode (T->pRight, X);
else { //T->key == X
NODE* p = T;
if(T->pLeft == NULL)
T = T->pRight;
else if(T->pRight == NULL)
T = T->pLeft;
else { //T có c 2 con
NODE* q = T->pRight;
searchStandFor(p, q);
}
delete p;
}
return 1;
}
Trong ó, hàm searchStandFor c vi t nh sau:
void searchStandFor(TREE &p, TREE &q) {
if(q->pLeft)
searchStandFor(p, q->pLeft);
else {
p->key = q->key;
p = q;
q = q->pRight;
}
}

v T o m t cây CNPTK
Ta có th t o m t cây nh phân tìm ki m b ng cách l p l i quá trình thêm 1 ph n t
vào m t cây r ng.
v 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.
void removeTree(TREE &T) {
if(T!=NULL) {
Ch ng 7. C u trúc cây Trang 84
u trúc d li u và gi i thu t
removeTree(T->pLeft);
removeTree(T->pRight);
delete(T);
}
}
7.4. ánh giá
T t c các thao tác searchNode, insertNode, delNode trên CNPTK u có ph c
t p trung bình O(h), v i h là chi u cao c a cây
Trong trong tr ng h p t t nh t, CNPTK có n nút s có cao h = log2(n). Chi phí
tìm ki m khi ó s t ng ng tìm ki m nh phân trên m ng có th t .
Tuy nhiên, trong tr ng h p x u nh t, cây có th b suy bi n thành 1 DSLK (khi
mà m i nút u ch có 1 con tr nút lá). Lúc ó các thao tác trên s có ph c t p O(n).
Vì v y c n có c i ti n c u trúc c a CNPTK t c chi phí cho các thao tác là
log2(n).

7.5. Cây nh phân cân b ng


7.5.1. Cây nh phân cân b ng hoàn toàn
Cây nh phân cân b ng hoàn toàn là cây nh phân tìm ki m mà t i m i nút c a
nó, s nút c a cây con trái chênh l ch không quá m t so v i s nút c a cây con ph i.
− M t cây r t khó t c tr ng thái cân b ng hoàn toàn và c ng r t d m t cân
b ng vì khi thêm hay h y các nút trên cây có th làm cây m t cân b ng (xác
su t r t l n), chi phí cân b ng l i cây l n vì ph i thao tác trên toàn b cây.
− Tuy nhiên n u cây cân i thì vi c tìm ki m s nhanh. i v i cây cân b ng
hoàn toàn, trong tr ng h p x u nh t ta ch ph i tìm qua log2n ph n t (n là s
nút trên cây).
Sau ây là ví d m t cây cân b ng hoàn toàn (CCBHT):

− CCBHT có n nút có chi u cao h ≥ log2n. ây chính là lý do cho phép b o m


kh n ng tìm ki m nhanh trên CTDL này.
− Do CCBHT là m t c u trúc kém n nh nên trong th c t không th s d ng.
Nh ng u i m c a nó l i r t quan tr ng. Vì v y, c n a ra m t CTDL khác có
c tính gi ng CCBHT nh ng n nh h n.

Ch ng 7. C u trúc cây Trang 85


u trúc d li u và gi i thu t
− Nh v y, c n tìm cách t ch c m t cây t tr ng thái cân b ng y u h n và vi c
cân b ng l i ch x y ra ph m vi c c b nh ng v n ph i b o m chi phí cho
thao tác tìm ki m t m c O(log2n)
7.5.2. Cây nh phân cân b ng (AVL)
Cây nh phân tìm ki m cân b ng là cây mà t i m i nút c a nó cao c a cây con
trái và c a cây con ph i chênh l ch không quá m t.
AVL là tên vi t t t c a các tác gi ng i Nga ã a ra nh ngh a c a cây cân
b ng Adelson-Velskii và Landis (1962). Vì lý do này, ng i ta g i cây nh phân cân
ng là cây AVL. Tù nay v sau, chúng ta s dùng thu t ng cây AVL thay cho cây cân
b ng.
T khi c gi i thi u, cây AVL ã nhanh chóng tìm th y ng d ng trong nhi u
bài toán khác nhau. Vì v y, nó mau chóng tr nên th nh hành và thu hút nhi u nghiên
c u. T cây AVL, ng i ta ã phát tri n thêm nhi u lo i CTDL h u d ng khác nh cây
- en (Red-Black Tree), B-Tree, …
i ây là ví d cây cân b ng (l u ý, cây này không ph i là cây cân b ng hoàn
toàn):

− D dàng th y CCBHT là cây cân b ng. u ng c l i không úng.


v Ch s cân b ng c a m t nút: Ch s cân b ng c a m t nút là hi u c a chi u
cao cây con ph i và cây con trái c a nó.
i v i m t cây cân b ng, ch s cân b ng (CSCB) c a m i nút ch có th mang
m t trong ba giá tr sau ây:
− CSCB(p) = 0 <=> cao cây trái (p) = cao cây ph i (p)
− CSCB(p) = 1 <=> cao cây trái (p) < cao cây ph i (p)
− CSCB(p) =-1 <=> cao cây trái (p) > cao cây ph i (p)
kh o sát cây cân b ng, ta c n l u thêm thông tin v ch s cân b ng t i m i nút.
Lúc ó, cây cân b ng có th c khai báo nh sau:
typedef struct AVLNode {
char balFactor; //Ch s cân b ng
DATA key;
struct AVLNode* pLeft;
Ch ng 7. C u trúc cây Trang 86
u trúc d li u và gi i thu t
struct AVLNode* pRight;
};
typedef struct AVLNode AVLNODE;
typedef AVLNODE *AVLTREE;

Bài t p:
1. Cài t ch ng trình mô ph ng tr c quan các thao tác trên cây nh phân, cây nh
phân tìm ki m.
2. Vi t các hàm xác nh các thông tin c a cây nh phân T:
• S nút lá
• S nút có úng 1 cây con
• S nút có úng 2 cây con
• S nút có khóa nh h n x (gi s T là CNPTK)
• S nút có khóa l n h n x (gi s T là CNPTK)
• S nút có khóa l n h n x và nh h n y (T là CNPTK)
• Chi u cao c a cây
• In ra t t c các nút t ng (m c) th k c a cây T
• In ra t t c các nút theo th t t t ng 0 n t ng th h-1 c a cây T (h là
chi u cao c a T).
• Ki m tra xem T có ph i là cây cân b ng hoàn toàn không.
• l ch l n nh t trên cây. ( l ch c a m t nút là l ch gi a chi u cao
c a cây con trái và cây con ph i c a nó. l ch l n nh t trên cây là
l ch c a nút có l ch l n nh t).
3. Xét thu t gi i t o cây nh phân tìm ki m. N u th t các khóa nh p vào là nh
sau: 8 3 5 2 20 11 30 9 18 4
thì hình nh cây t o c nh th nào ?
Sau ó, n u h y l n l t các nút theo th t nh sau : 18, 20
thì cây s thay i nh th nào trong t ng b c h y, v s (nêu rõ ph ng
pháp h y khi nút có c 2 cây con trái và ph i)
4. Gi s A là m t m ng các s th c ã có th t t ng. Hãy vi t hàm t o m t cây
nh phân tìm ki m có chi u cao th p nh t t các ph n t c a A.

Ch ng 7. C u trúc cây Trang 87

You might also like