Ch
ng 3: C u trúc cây
Trees
TS. Tr n Cao
N m 2010
1
Thu t ng c b n
̈
Cây: là m t t p h p các ph n t g i là nút (nodes):
̈
̈
̈
̈
̈
̈
̈
Có m t nút đ c phân bi t g i là nút g c (root).
Quan h cha - con (parenthood): xác đ nh h th ng c u
trúc phân c p trên các nút.
M i nút, tr nút g c, có duy nh t m t nút cha.
M t nút có th có nhi u nút con ho c không có nút con
nào.
M i nút bi u di n m t ph n t trong t p h p đang xét và
nó có th có m t ki u nào đó b t k .
Bi u di n nút b ng m t kí t , m t chu i ho c m t s ghi
trong vòng tròn.
M i quan h cha con đ c bi u di n theo qui c nút cha
dòng trên nút con dòng d i và đ c n i b i m t
đo n th ng.
2
Ví d m t cây
1
2
5
3
6
7
9
4
10
8
3
nh ngh a
̈
̈
̈
M t nút đ n đ c là m t cây.
Nút này c ng chính là nút g c
c a cây.
Gi s ta có n là m t nút đ n
đ c và k cây T1,.., Tk v i các
nút g c t ng ng là n1,.., nk thì
có th xây d ng m t cây m i
b ng cách cho nút n là cha c a
các nút n1,.., nk. Cây m i này có
nút g c là nút n và các cây T1,..,
Tk đ c g i là các cây con.
T p r ng c ng đ c coi là m t
cây và g i là cây r ng kí hi u
∅.
n
n1
n2
nk
T1
T2
Tk
4
Thu t ng
̈
̈
̈
̈
̈
̈
̈
ng đi: chu i các nút n1,.., nk,
trong đó ni là nút cha c a nút ni+1,
v i i=1..k-1
dài đ ng đi = s nút – 1
ng đi t m t nút đ n chính nó
có đ dài b ng không.
N u có đ ng đi t nút a đ n nút
b thì ta nói a là ti n b i (ancestor)
c a b, còn b g i là h u du
5
(descendant) c a nút a.
m t nút v a là ti n b i v a là h u
du c a chính nó.
Ti n b i ho c h u du c a m t
nút khác v i chính nó g i là ti n
b i ho c h u du th c s .
Nút g c không có ti n b i th c
s .
1
2
3
6
7
9
4
10
8
5
̈
̈
̈
̈
̈
̈
̈
Nút không có h u du th c s
g i là nút lá (leaf).
Nút không ph i là lá ta còn g i
là nút trung gian (interior).
Cây con c a m t cây là m t
nút cùng v i t t c các h u du
c a nó.
5
Chi u cao c a m t nút là đ
dài đ ng đi l n nh t t nút đó
t i lá.
Chi u cao c a cây là chi u cao
c a nút g c.
sâu c a m t nút là đ dài
đ ng đi t nút g c đ n nút
đó.
Các nút có cùng m t đ sâu i
ta g i là các nút có cùng m t
m c i.
1
2
3
6
7
9
4
10
8
6
Th t nút
̈
̈
̈
̈
̈
N u ta phân bi t th t các nút
con c a cùng m t nút thì cây
g i là cây có th t
Th t qui c t trái sang
ph i.
N u không phân bi t rõ ràng
th t các nút thì ta g i là cây
không có th t .
Các nút con cùng m t nút cha
g i là các nút anh em ru t
(siblings).
Quan h "trái sang ph i" c a
các anh em ru t có th m r ng
cho hai nút b t k .
A
B
C
A
C
B
7
Duy t cây
̈
̈
̈
Duy t cây là m t qui t c cho phép đi qua l n l t t t
c các nút c a cây m i nút đúng m t l n
Danh sách li t kê các nút (tên nút/ giá tr ) theo th
t đi qua g i là danh sách duy t cây.
Ba cách duy t cây quan tr ng:
̈
̈
̈
duy t ti n t (preorder),
duy t trung t (inorder),
duy t h u t (posorder).
8
̈
̈
̈
Cây r ng:
̈ ti n t , trung t , h u t =
R NG.
Cây ch có m t nút n:
̈ ti n t , trung t , h u t c a
cây= n.
n
T
n1
n2
nk
T1
T2
Tk
T g c n, các cây con T1,…, Tk:
̈ Ti n t (T) = n, ti n t (T1),
…, ti n t (Tk)
̈ Trung t (T) = Trung t (T1), n,
trung t (T2), …, trung t (Tk)
̈ H u t (T) = h u t (T1), …,
h u t (Tk), n
9
Ví d duy t cây
1
̈
̈
̈
Ti n t
1, 2, 5, 6, 3, 7, 8, 9, 10,
4
Trung t
5, 2, 6, 1, 8, 7, 3, 9, 10,
4
H ut
5, 6, 2, 8, 7, 9, 10, 3, 4,
1
2
5
3
6
7
9
4
10
8
10
Bài t p
A
B
H
C
D
E
K
F
L
Duy t Ti n t , trung t , h u t cây
̈ ti n t : A B C D E F H K L
̈ trung t : C B E D F A K H L
̈ h ut :CEFDBKLHA
11
Cây có nhãn và cây bi u th c
̈
Ta th ng l u tr k t h p m t
nhãn (label) ho c còn g i là m t
giá tr (value) v i m t nút c a
cây. Nh v y nhãn c a m t nút
không ph i là tên nút mà là giá tr
đ c l u gi t i nút đó.
n1
+
*
_
n2
n3
n4
n5
n6
n7
a
b
a
c
Bi u th c: (a+b)*(a-c)
̈
Qui t c bi u di n bi u th c toán
h c
E1 E2
E1
E2
12
+
+
a+b
a
b
b
a
-
a-b
a
b
-
a*c - b
*
a
*
b
c
a
-
c
b
13
cây bi u th c
̈
-
Khi duy t m t cây bi u di n
m t bi u th c toán h c và li t
kê nhãn c a các nút theo th t
duy t thì ta có:
̈
̈
̈
Bi u th c d ng ti n t hay bi u
th c ti n t (prefix) t ng ng
v i phép duy t ti n t c a cây.
Bi u th c d ng trung t hay bi u
th c trung t (infix) t ng ng
v i phép duy t trung t c a cây.
Bi u th c d ng h u t hay bi u
th c h u t (posfix) t ng ng
v i phép duy t h u t c a cây.
*
a
b
c
Bi u th c ti n t - * a c b
Bi u th c trung t a * c – b
Bi u th c h u t a c * b 14
KI U D
̈
̈
̈
̈
̈
̈
̈
LI U TR U T
CÂY
NG
Hàm PARENT(n,T) cho nút cha c a nút n trên cây T
Hàm LEFTMOST_CHILD(n,T) cho nút con trái nh t c a nút n trên cây
T, n u n là lá thì hàm cho giá tr NULL.
Hàm RIGHT_SIBLING(n,T) cho nút anh em ru t ph i nút n trên cây T,
n u n không có anh em ru t ph i thì hàm cho giá tr NULL.
Hàm LABEL_NODE(n,T) cho nhãn t i nút n c a cây T.
Hàm ROOT(T) tr ra nút g c c a cây T. N u Cây T r ng thì hàm tr v
NULL.
Hàm CREATEi(v,T1,T2,..,Ti),v i i=0..n, th t c t o cây m i có nút g c là
n đ c gán nhãn v và có i cây con T1,..,Ti.
̈ N u n= 0 thì th t c t o cây m i ch g m có 1 nút đ n đ c là n có nhãn
v.
Hàm EMPTY_TREE(T) tr v true n u cây r ng, ng c l i nó tr v
false.
15
Cài đ t cây b ng m ng
̈
̈
gán tên cho các nút l n l t là 0,1,
2, .., n-1.
Dùng m t m ng m t chi u A đ
l u tr cây:
̈
̈
̈
A[i] = j v i j là nút cha c a nút i.
N u i là nút g c ta cho a[i] = Null
N u cây T là cây có nhãn:
̈
̈
Dùng thêm m t m ng m t chi u
th hai L ch a các nhãn: cho L[i]
= x v i x là nhãn
Ho c khai báo m ng a là m ng
c a các struct có hai tr ng:
̈
̈
tr
tr
ng Parent gi ch s nút cha;
ng Data gi nhãn c a nút
̈
̈
̈
MaxNode gi s nút hi n t i đang
có trên cây.
Hàm PARENT(n,T) t n ch m t
h ng th i gian
Hàm đòi h i thông tin v các con
không làm vi c t t
̈
qui c vi c đ t tên cho các nút
(đánh s th t ) nh sau:
̈
̈
̈
ánh s theo th t t ng d n b t
đ u t i nút g c.
Nút cha đ c đánh s tr c các
nút con.
Các nút con cùng m t nút cha
đ c đánh s l n l t t trái
sang ph i
16
1
2
3
5
6
7
4
9
10
Maxlength
8
Ch
s
1
2
3
4
5
6
7
8
9
10
Pare
nt
-1
1
1
1
2
2
3
7
3
3
data
Maxnode
17
Ví d khác
A
1
3
C
B
4
D
F
5
0
8
E
G
6
I
2
J
9
H
7
18
Khai báo c u trúc d li u
#define MAXLENGTH ... /* ch s t i đa c a m ng */
#define NULL -1
typedef ... DataType;
typedef int Node;
typedef struct {
/* L u tr nhãn (d li u) c a nút trong cây */
DataType Data[MAXLENGTH];
/* L u tr cha c a các nút trong cây theo nguyên t c:
Cha c a nút i s l u v trí i trong m ng */
Node Parent[MAXLENGTH];
/* S nút th c s trong cây */
int MaxNode;
} Tree;
Tree T;
19
Kh i t o cây r ng
void MAKENULL_TREE (Tree& T){
T.MaxNode=0;
}
Ki m tra cây r ng
int EMPTY_TREE(Tree T){
return T.MaxNode == 0;
}
Xác đ nh nút cha c a nút trên cây
Node PARENT(Node n,Tree T){
if (EMPTY_TREE(T) || (n>T.MaxNode-1))
return NULL;
else return T.Parent[n];
}
20
Xác đ nh nhãn c a nút trên cây
DataType LABEL_NODE(Node n,Tree T){
if (!EMPTY_TREE(T) && (n<=T.MaxNode-1))
return T.Data[n];
}
Hàm xác đ nh nút g c trong cây
Node ROOT(Tree T){
if (!EMPTY_TREE(T)) return 0;
else return NULL;
}
21
Hàm xác đ nh con trái nh t c a m t nút
Node LEFTMOST_CHILD(Node n,Tree T){
Node i;
if (n<0) return NULL;
i=n+1;/* V trí nút đ u tiên hy v ng là con c a nút n */
while (i<=T.MaxNode-1)
if (T.Parent[i]==n) return i;
else i=i+1;
return NULL;
}
22
Hàm xác đ nh anh em ru t ph i c a m t nút
Node RIGHT_SIBLING(Node n,Tree T){
Node i,parent;
if (n<0) return NULL;
parent=T.Parent[n];
i=n+1;
while (i<=T.MaxNode-1)
if (T.Parent[i]==parent) return i;
else i=i+1;
return NULL;
}
23
Th t c duy t ti n t
void PreOrder(Node n,Tree T){
printf("%c ",LABEL_NODE(n,T));
Node i=LEFTMOST_CHILD(n,T);
while (i!=NULL){
PreOrder(i,T);
i=RIGHT_SIBLING(i,T);
}
}
24
Th t c duy t trung t
void InOrder(Node n,Tree T){
Node i=LEFTMOST_CHILD(n,T);
if (i!=NULL) InOrder(i,T);
printf("%c ",LABEL_NODE(n,T));
i=RIGHT_SIBLING(i,T);
while (i!=NULL){
InOrder(i,T);
i=RIGHT_SIBLING(i,T);
}
}
25