1. Trang chủ
  2. » Công Nghệ Thông Tin

Bài giảng cấu trúc dữ liệu thuật toán chương 4 nguyễn đức nghĩa

65 243 1

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 65
Dung lượng 5,49 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

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 2

cá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 4

Câ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 5

Cây phân c p qu n lý hành chính

Ban Giám đ c

Phòng Tài v

Trang 7

Cây bi u th c (Expression Tree)

Trang 8

• Nút trong - internal node

• Chi u cao - hight

• Chi u sâu - depth

Trang 9

Cá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 10

parent

Trang 11

Thu t ng

con cha

Trang 12

Thu 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 13

Thu t ng cây con

sibling

Trang 14

ng đi trên cây

a

c b

Path 1: { a, b, f, j } Path 2: { d, i }

Trang 15

How 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 17

X 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 18

Duy t theo th t sau - Postorder Traversal

Trang 19

Thu 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 20

Thu 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 21

4.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 23

4.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 24

Bi 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 25

Bi 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 26

Danh 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 27

Cà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 28

Bi 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 29

Dù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 30

4.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 31

Tí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 32

Câ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 33

Câ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 34

4.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 35

Câ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 36

D 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 38

Cà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 39

Duy 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 40

Preorder 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 41

Inorder Traversal

24

7

5

8 10

3

69

1

11

1, 7, 9, 4, 6, 3, 2, 10, 5, 11, 8

24

Trang 42

Duy 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 43

Ví 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 44

printf("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 45

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);

printf("The number of nodes is: %d\n",countNodes(randomTree));

printf("The depth of the tree is: %d\n", depth(randomTree));

Trang 46

4.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 53

Mã 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 54

Câ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 57

61 55 41 40

E Char

T A O I N

R H L D

31 27

C U

Trang 61

238 T

81

Trang 62

238 270

126

238 270

Trang 63

238 270

126

238 270

Trang 64

Xâ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;

Ngày đăng: 04/12/2015, 17:49

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm