How We View a Tree... Vì th các phép toánnh leftmost_child và right_sibling là không xác đ nh đ c.. Do đó cách bi u Danh sách các con Lists of Children danh sách các con c a nó.. di n da
Trang 2các nút r1,r2, , r k Trong cây này r là g c và T1, T2, , T k là các cây con c a g c r Các nút r1, r2, , r k đ c g i là con (children)
c a nút r.
Chú ý: Nhi u khi đ phù h p ta c n đ nh ngh a cây r ng (null
Trang 4Cây l ch thi đ u
1/28/2013
Trong i th ng cây r t hay c s d ng di n t
l ch thi u c a các gi i th thao theo th th c u lo i
Johan I 1667-1748
Nikolaus 1662-1716
Jacob I 1654-1705
Nikolaus II
1695-1726
Daniel 1700-1782
Johan II 1710-1790
Nikolaus I 1687-1759
Jacob II 1759-1789 Johan III
1746-1807
Trang 5Cây phân c p qu n lý hành chính
Ban Giám đ c
Phòng Tài v
Trang 7Cây bi u th c (Expression Tree)
Trang 8• Nút trong - internal node
• Chi u cao - hight
• Chi u sâu - depth
Trang 9Các thu t ng chính
• N u n1, n2, , n k là dãy nút trên cây sao cho n i là chac a n i+1 v i 1 i < k, thì dãy
nàyđ c g i là đ ng đi (path) t nút n1t i nút n k. dài (length) c a đ ng đi là
b ng s l ng nút trên đ ng đi tr b t 1 Nh v y đ ng đi đ dài 0 là đ ng đi t
• Các nút có cùng chađ c g i là anh em (sibling).
• Cây con (subtree)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ó.
• Chi u cao (height) c a nút trên cây là b ng đ dài c a đ ng đi dài nh t t nút đó
đ n lá c ng 1 Chi u cao c a cây (height of a tree) là chi u cao c a g c. sâu/m c
(depth/level)c a nút là b ng 1 c ng v i đ dài c a đ ng đi duy nh t t g c đ n nó.
1/28/2013 C U TRÚC D LI U VÀ THU T TOÁN
Thu t ng nút
nodes
Trang 10parent
Trang 11Thu t ng
con cha
Trang 12Thu t ng cây con - subtree
1/28/2013
C U TRÚC D LI U VÀ THU T TOÁN
Thu t ng cây con
Trang 13Thu t ng cây con
sibling
Trang 14ng đi trên cây
a
c b
Path 1: { a, b, f, j } Path 2: { d, i }
Trang 15How We View a Tree
Trang 16• Các con c a m t nút th ng đ c x p th t t trái sang ph i Nh
v y hai cây trong hình sau đây là khác nhau, b i vì hai con c a nút
a xu t hi n trong hai cây theo th t khác nhau:
Trang 17X p th t các nút
th t quan tr ng nh t, đó là Th t tr c, Th t sau và
Th t gi a (Preorder, Postorder, và Inorder)
– N u cây T là r ng, thì danh sách r ng là danh sách theo th
Duy t theo th t tr c - Preorder Traversal
• Th t tr c (hay duy t theo th t tr c - preorder
Trang 18Duy t theo th t sau - Postorder Traversal
Trang 19Thu t toán duy t theo th t tr c - Preorder Traversal
void PREORDER ( nodeT r )
e
j
1/28/2013 C U TRÚC D LI U VÀ THU T TOÁN
Thu t toán duy t theo th t sau - Postorder Traversal
• Thu t toán duy t theo th t sau thu đ c b ng cách đ o ng c hai thao tác (1) và (2) trong PREORDER :
void POSTORDER ( nodeT r )
e
j
Trang 20Thu t toán duy t theo th t gi a - Inorder Traversal
void INORDER (nodeT r )
v a trình bày hãy hình dung là ta đi vòng
quanh bên ngoài cây b t đ u t g c, ng c
chi u kim đ ng h và sát theo cây nh t
Ch ng h n, đ ng đi đó đ i v i cây trong
e
j
• i v i th t tr c , ta đ a ra nút m i khi đi qua nó.
• i v i th t sau , ta đ a ra nút khi qua nó l n cu i tr c khi quay v cha c a nó.
• i v i th t gi a , ta đ a ra lá ngay khi đi qua nó, còn nh ng nút trong đ c đ a ra khi l n th hai đ c đi qua.
• Chú ý r ng các lá đ c x p th t t trái sang ph i nh nhau trong c
ba cách s p x p.
Trang 214.1.4 Cây có nhãn (Labeled Tree)
• Thông th ng ng i ta gán cho m i nút c a cây m t nhãn (label)
ho c m t giá tr , c ng t ng t nh chúng ta đã gán m i nút c a danh sách v i m t ph n t Ngh a là, nhãn c a nút không ph i là tên
g i c a nút mà là giá tr đ c c t gi trong nó Trong m t s ng
d ng ta có th thay đ i nhãn c a nút mà tên c a nó v n đ c gi nguyên.
• Ví d : Xét cây có 7 nút n1, , n7 Ta gán nhãn cho các nút nh sau:
Cây bi u th c (Expression Tree)
• Cây trong ví d v a nêu có tên g i là cây bi u th c
(a+b)*(a-c)
• Qui t c đ cây có nhãn bi u di n m t bi u th c là:
– M i nút lá có nhãn là toán h ng và ch g m m t toán h ng đó Ví d nút n4 bi u
di n bi u th c a.
– M i nút trong n đ c gán nhãn là phép toán Gi s n có nhãn là phép toán hai
ngôi q, nh + ho c *, và con trái bi u di n bi u th c E1 và con ph i bi u di n
Trang 234.1.5 ADT Cây
n là g c (nó không có cha), tr l i Theo ngh a này, là nút
r ng ("null node") dùng đ báo hi u r ng chúng ta s d i kh icây
• leftmost_child(n, T) tr l i con trái nh t c a nút n trong cây T,
• label(n, T) tr l i nhãn c a nút n trong cây T Tuy nhiên, ta
không đòi h i cây nào c ng có nhãn
• createi(v, T1, T2, , T i) là h các hàm, m i hàm cho m t giá
tr c a i = 0, 1, 2, createi t o m t nút m i r v i nhãn v và
g n cho nó i con, v i các con là các g c c a cây T1, T2, , T i,theo th t t trái sang Tr l i cây v i g c r Chú ý, n u i = 0, thì r v a là lá v a là g c
• root(T) tr l i nút là g c c a cây T, ho c n u T là cây r ng.
• makenull(T) bi n T thành cây r ng.
Trang 24Bi u di n cây
• Có nhi u cách bi u di n cây Ta gi i thi u qua v ba cách bi u
di n c b n:
– danh sách các con (Lists of Children)
bi u di n T là h tr thao tác parent b i danh sách tuy n tính A
trong đó m i ph n t A[i] ch a con tr đ n cha c a nút i Riêng g c
c a T có th phân bi t b i con tr r ng.
• Khi dùng m ng, ta đ t A[i] = j n u nút j là cha c a nút i, và A[i] = 0
n u nút i là g c.
• Cách bi u di n này d a trên c s là m i nút c a cây (ngo i tr g c)
đ u có duy nh t m t cha V i cách bi u di n này cha c a m t nút có
th xác đ nh trong th i gian h ng s ng đi t m t nút đ n t tiên c a chúng (k c đ n g c) có th xác đ nh d dàng:
Trang 25Bi u di n cây dùng m ng
• Ví d
A
• H n ch : Cách dùng con tr cha không thích h p cho các thao tác v i con Cho nút
n, ta s m t nhi u th i gian đ xác đ nh các con c a n, ho c chi u cao c a n H n
n a bi u di n b i con tr cha không cho ta th t c a các nút con Vì th các phép toánnh leftmost_child và right_sibling là không xác đ nh đ c Do đó cách bi u
Danh sách các con (Lists of Children)
danh sách các con c a nó
di n danh sách đã trình bày trong ch ng tr c
nh t
Trang 26Danh sách các con (Lists of Children)
• Có m ng con tr đ n đ u các danh sách con c a các nút 1, 2, , 10:
header[i] tr đ n danh sách con c a nút i.
Danh sách các con (Lists of Children)
• Ví d : Có th s d ng mô t sau đây đ bi u di n cây
typedef ? NodeT; /* d u ? c n thay b i đ nh ngh a ki u phù h p */
typedef ? ListT; /* d u ? c n thay b i đ nh ngh a ki u danh sách phù h p */
Trang 27Cài đ t leftmost_child
• D i đây là minh h a cài đ t phép toán leftmost_child Vi c
cài đ t các phép toán còn l i đ c coi là bài t p
NodeT leftmost_child (NodeT n, TreeT T)
/* tr l i con trái nh t c a nút n trong cây T */ {
ListT L; /* danh sách các con c a n */
• Vì v y đ bi u di n cây ta có th l u tr thông tin v con c c trái và em k
c n ph i c a m i nút Ta có th s d ng mô t sau:
struct Tnode
{
charword[20]; // D li u c t gi nút
struct Tnode *leftmost_child;
struct Tnode *right_sibling;
};
typedef struct Tnode treeNode;
treeNode Root;
Trang 28Bi u di n cây b i con trái và em k c n ph i
H
G B
I
C
K J
55
Bi u di n cây t ng quát b i cây nh phân (con trái và con ph i=em k c n ph i) A
A B
D C
J I H
H
G B
I
C
K J
Cây nh phân
Trang 29Dùng con trái và em k c n ph i
(The Leftmost-Child, Right-Sibling Representation)
Duych có thao tác parent là đòi h i ph i duy t danh sách nên
th ng xuyên, ng i ta ch p nh n b sung thêm 1 tr ng n avàob n ghi đ l u cha c a nút
Trang 304.2.1 nh ngh a cây nh phân - Binary Tree
• nh ngh a Cây nh phân là cây mà m i nút có nhi u nh t là
Cây nh phân T 1 Cây nh phân T 2 Cây t ng quát
Trang 31Tính ch t c a cây nh phân
• B đ 1
(i) S đ nh l n nh t trên m c i c a cây nh phân là 2 i-1 , i≥1.
(ii) M t cây nh phân v i chi u cao k có không quá 2 k -1 nút , k ≥ 1 (iii) M t cây nh phân có n nút có chi u cao t i thi u là log2(n+1).
• Ch ng minh:
• (i) B ng qui n p theo i
– C s : G c là nút duy nh t trên m c i=1 Nh v y s đ nh l n nh t
trênm c i=1 là 20= 2 i-1
– Chuy n qui n p: Gi s v i m i j, 1 ≤ j < i, s đ nh l n nh t trên m c
j là 2 j-1 Do s đ nh trên m c i-1 là 2 i -2 , m t khác theo đ nh ngh a m i
đ nh trên cây nh phân có không quá 2 con, ta suy ra s l ng nút l n
nh t trên m c i là không v t quá 2 l n s l ng nút trên m c i-1,
ngh a là không v t quá 2*2i - 2 = 2 i-1
1/28/2013 C U TRÚC D LI U VÀ THU T TOÁN
Tính ch t c a cây nh phân
2, , k, theo b đ 1, s này là không v t quá
nút các m c i =1, 2, , k đ u là l n nh t có th đ c T đó
ta có:
1 1
Trang 32Cây nh phân đ y đ (full binary tree)
nh ngh a Cây nh phân đ y đ (Full Binary Trees) là cây
Cây nh phân hoàn ch nh (Complete Binary Trees)
nh phân đ sâu n tho mãn:
– là cây nh phân đ y đ n u không tính đ n các nút đ sâu n, và
– t t c các nút đ sâu n là l ch sang trái nh t có th đ c
• B đ 3 Cây nh phân hoàn ch nh đ sâu n có s l ng nút n m trong
kho ng t 2 n-1 đ n 2 n - 1
• Ch ng minh Suy tr c ti p t đ nh ngh a và b đ 1.
Ví d Cây nh phân hoàn ch nh
Trang 33Cây nh phân cân đ i (balanced binary tree)
• nh ngh a Cây nh phân đ c g i là cân đ i (balanced ) n u chi u cao
c a cây con trái và chi u cao c a cây con ph i chênh lêch nhau không quá
1 đ n v
• Nh n xét:
– N u cây nh phân là đ y đ thì nó là hoàn ch nh
– N u cây nh phân là hoàn ch nh thì nó là cân đ i
Ví d :
1 Cây nào là đ y đ ?
2 Cây nào là hoàn ch nh?
3 Cây nào là cân đ i?
Trang 344.2.2 Bi u di n cây nh phân
d ng cách bi u di n này ta có th cài đ t nhi u phép toán v i cây r t
hi u qu
tr Gán tên cho các nút c a cây nh phân hoàn ch nh T t trên xu ng
m ng A trong đó ph n t th i c a A là giá tr c t gi trong nút th i
HD
B
K
L J
F
E
C A
Trang 35Cây nh phân hoàn ch nh
Cây nh phân hoàn ch nh Complete Complete Binary Tree Binary Tree
H
H D D K K B B F F J J L L A A C C E E
0 1 2 3 4 5 6 7 8 9 10
tìm S d ng H n chCon trái c a A[i] A[2*i] 2*i <= n
Con ph i c a A[i] A[2*i + 1] 2*i + 1 <= n
Cha c a A[i] A[i/2] i > 1
Bi u di n cây nh phân dùng con tr
M i nút c a cây s có con tr đ n con trái và con tr đ n
Trang 36D C
J I H
H
G B
I
C
K J
struct Tnode * left;
struct Tnode *right;
};
typedef struct Tnode treeNode;
treeNode* makeTreeNode(char *word);
treeNode *RandomInsert(treeNode* tree,char *word);
void freeTree(treeNode *tree);
void printPreorder(treeNode *tree);
void printPostorder(treeNode *tree);
void printInorder(treeNode *tree);
int countNodes(treeNode *tree);
int depth(treeNode *tree);
Trang 38Cài đ t hàm tính s nút và đ sâu c a cây
int countNodes(treeNode *tree) {
/* the function counts the number of nodes of a tree*/
if( tree == NULL ) return 0;
int depth(treeNode *tree) {
/* the function computes the depth of a tree */
if( tree == NULL ) return 0;
Trang 39Duy t cây nh phân
• Duy t cây nh phân là cách duy t có h th ng các nút c a cây
T ng t cây t ng quát, ta xét ba th t duy t cây nh phân:
– Th m nút (Visit a node),
– Th m cây con trái theo th t tr c (Visit left subtree),
– Th m cây con ph i theo th t tr c (Visit right subtree)
– Th m cây con trái theo th t sau (Visit left subtree),
– Th m cây con ph i theo th t sau (Visit right subtree)
• Th m nút (Visit the node)
• Duy t cây con trái (Traverse the left subtree)
• Duy t cây con ph i (Traverse the right subtree)
void printPreorder(treeNode *tree)
Trang 40Preorder Traversal
24
7
5
8 10
3
6
9 1
11
2, 4, 7, 1, 9, 3, 6, 5, 10, 8, 11
24
• Duy t cây con trái (Traverse the left subtree)
• Th m nút (Visit the node)
• Duy t cây con ph i (Traverse the right subtree).
void printInorder(treeNode *tree)
Trang 41Inorder Traversal
24
7
5
8 10
3
69
1
11
1, 7, 9, 4, 6, 3, 2, 10, 5, 11, 8
24
Trang 42Duy t theo th t sau - LRN
Postorder Traversal
• Duy t cây con trái (Traverse the left subtree)
• Duy t cây con ph i (Traverse the right subtree)
• Th m nút (Visit the node).
void printPostorder(treeNode *tree)
7
5
8 10
3
69
1
11
1, 9, 7, 6, 3, 4, 10, 11, 8, 5, 2
24
Trang 43Ví d : Duy t cây nh phân
• Chú ý: Ta có th xây d ng đ c cây nh phân mà th t tr c và
th t gi a ho c th t sau và th t gi a là nh nhau; nh ng không
th có cây nh phân mà th t tr c và th t sau là nh nhau
struct Tnode * left;
struct Tnode *right;
};
typedef struct Tnode treeNode;
treeNode* makeTreeNode(char *word);
treeNode *RandomInsert(treeNode* tree,char *word);
void freeTree(treeNode *tree);
void printPreorder(treeNode *tree);
void printPostorder(treeNode *tree);
void printInorder(treeNode *tree);
int countNodes(treeNode *tree);
int depth(treeNode *tree);
Trang 44printf("The tree in preorder:\n"); printPreorder(randomTree);
printf("The tree in postorder:\n"); printPostorder(randomTree);
printf("The tree in inorder:\n"); printInorder(randomTree);
printf("The number of nodes is: %d\n",countNodes(randomTree));
printf("The depth of the tree is: %d\n", depth(randomTree));
G n ng u nhiên nút m i vào cây
treeNode *RandomInsert(treeNode *tree,char *word){
Trang 45struct Tnode * left;
struct Tnode *right;
};
typedef struct Tnode treeNode;
treeNode* makeTreeNode(char *word);
treeNode *RandomInsert(treeNode* tree,char *word);
void freeTree(treeNode *tree);
void printPreorder(treeNode *tree);
void printPostorder(treeNode *tree);
void printInorder(treeNode *tree);
int countNodes(treeNode *tree);
int depth(treeNode *tree);
printf("The number of nodes is: %d\n",countNodes(randomTree));
printf("The depth of the tree is: %d\n", depth(randomTree));
Trang 464.3.1 Cây bi u th c
An application of binary trees:
Binary Expression Trees
3 Các cây con trái và ph i c a nút phép toán bi u di n các bi u th c con ( subexpressions ) c n đ c th c
hi n tr c khi th c hi n phép toán g c c a các cây con.
Trang 47• M c (đ sâu) c a các nút trên cây cho bi t trình t
th c hi n chúng (ta không c n s d ng ngo c đ ch
Trang 49• Duy t cây bi u th c theo th t tr c (Preorder)
– Cho ta ký pháp ti n t (Prefix Notation)
• Duy t cây bi u th c theo th t gi a (Inorder)
– Cho ta ký pháp trung t (Infix Notation)
• Duy t cây bi u th c theo th t sau (Postorder)
– Cho ta ký pháp h u t (Postfix Notation)
Trang 52– Mã hoá với độ dài cố định (fixed length code) Dễ mã
hoá cũng như dễ giải mã, nhưng lại đòi hỏi bộ nhớ lớn
– Mã phi tiền tố (prefix free code) là cách mã hoá mỗi
ký tự c bởi một xâu nhị phân code(c) sao cho mã của
một ký tự bất kỳ không là đoạn đầu của bất cứ mã
của ký tự nào trong số các ký tự còn lại Tuy đòi hỏi
việc mã hoá và giải mã phức tạp hơn nhưng thông
thường tỏ ra đòi hỏi ít bộ nhớ hơn.
David A Huffman 1925-1999
Trang 53Mã hoá đ dài c đ nh
đ nh, đ dài c a xâu t i thi u là [log 26] =5 bit
C U TRÚC D LI U VÀ THU T TOÁN
NGUY N C NGH A - B môn KHMT
Cây mã hoá đ dài c đ nh
• Mã hoá đ dài c đ nh là mã phi ti n t
Trang 54Cây mã hoá Morse
• Mã hoá Morse không là phi ti n t
• Gi i mã “ -” ??? Ch u ch t?
• Ph i có d u phân bi t các ch cái: “ # -” IU
Trang 55• Bài toán:Tìm cách mã hoá t i u, t c là tìm cây nh phân T
làm t i thi u hoá t ng đ dài có tr ng s
trong đó depth(c) là đ dài đ ng đi t g c đ n lá t ng ng
c depth c
f T
Trang 5761 55 41 40
E Char
T A O I N
R H L D
31 27
C U
Trang 61238 T
81
Trang 62238 270
126
238 270
Trang 63238 270
126
238 270
Trang 64Xây dựng mã Huffman
125 Freq
93 80 76 73 71
61 55 41 40
E Char
T A O I N
R H L D
31 27
C U
65 S
0000 Fixed
0001 0010 0011 0100 0101
0111 1000 1001 1010 1011 1100 0110
110 Huff
011 000 001 1011 1010
1000 1111 0101 0100 11100 11101 1001
<Khởi động P là gốc của cây Huffman>
While <chưa đạt đến kết thúc của B> do
begin
x bit tiếp theo trong xâu B;
If x = 0 then P Con trái của P
Else P Con phải của P
If (P là nút lá ) then begin
<Hiển thị kí hiệu tương ứng với nút lá>
< ặt lại P là gốc của cây Huffman>
end;
end
end;