Tải bản đầy đủ (.docx) (94 trang)

CẤU TRÚC CÂY DỮ LIỆU và GIẢI THUẬT NEU

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (270.72 KB, 94 trang )

1

Chơng 5
Cấu trúc Cây (TREE)

Trong các chơng trớc đây,
chúng ta đã nghiên cứu các loại cấu
trúc dữ liệu tuyến tính . Trong chơng này chúng ta nghiên cứu một
loại cấu trúc dữ liệu phi tuyến là
cây và đồ thị Đây là một loại cấu
trúc dữ liệu có nhiều ứng dụng
trong thiết kế giải thuật.
1

1


2

5.1
cây

Một số khái niệm cơ bản về

Trớc hết , chúng ta sẽ xem xét
các khái niệm cơ bản về cây, khái
niệm cây nhị phân, các phơng
pháp quét một cây nhị phân .
Chúng ta cũng nghiên cứu các giải
thuật bổ sung ,loại bỏ đối với cấu
trúc dữ liệu cây và ứng dụng loại


cáu trúc dữ liệu này trong các bài
toán thực tế .
Định nghĩa
Cây là một tập hợp hữu hạn các
nút có mối quan hệ phân cấp
xuất phát từ một nút gọi là gốc
( Root)
2

2


3

Root

A

B

E

C

F

1

D


G

H

2

3

Hình 5.1 - Cấu
trúc cây
Ta thấy trong thực tiễn có
rất nhiều ví dụ cho loại cấu trúc dữ
liệu cây. Sau đây là một ví dụ
minh hoạ.
Tổng công ty Điện lực Việt
nam có 3 bộ phận ở ba vùng lãnh
thổ khác nhau : khu vực 1( Phía
Bắc), khu vực 3( Miền trung), khu
vực 2( Phía Nam) . Mỗi khu vực
quản lý Sỏ điện lực của các tỉnh,
3

3


4

thành phố trong khu vực của
mình. Mỗi Sở điện lực của tỉnh,
thành phố lại có Sở điện lực

huyện, Quận . Nh vậy cấu trúc bộ
máy tổ chức của Tổng công ty
điện lực là hình ảnh của một cấu
trúc dữ liệu loại cây tổng quát.
Một đặc điểm rất quan trọng
của cấu trúc cây là tính Tổng
chất
công ty
phân cấp theo thứ bậc của các
nút .Các nút đợc phân cấp theo
mức của chúng. Chúng ta qui ớc nút
vùng 1 vùng 2 vùng
gốc luôn luôn có mức 1, còn các nút
con của nút gốc sẽ có mức tăng
dần. Giả sử ,nút thứ i có mức là k
thì các nút con của nút i sẽ có mức
Tỉnh 1Tỉnh 2Tỉnh 3
là k+1.
Bây giờ ta xét vấn đề
quét một cấu trúc hình cây.
4

42
Huyện
1 Huyện
Huyện


5


Chúng ta gọi phép quét cây là
quá trình thâm nhập vào các nút
của nó một cách có hệ thống sao
cho mỗi nút chỉ đợc thâm nhập
một lần .
5. 2
tree)

cây

nhị

phân

(Binary

Cây nhị phân là một trờng
hợp riêng của cây tổng quát và có
rất nhiều ứng dụng trong thiết kế
giải thuật.
Trong trờng hợp này, mỗi nút
của cây chỉ có 2 nút con gọi là
nút con trái ( LChild ) và nút con
phải (RChild).
Hình ảnh của một cây nhị phân
biểu diễn trong hình vẽ sau đây.
5

5



6

Trong h×nh vÏ nµy , A lµ
nót gèc( Root). LChild cña A lµ B
cßn RChild cña A lµ C. §Õn lît
m×nh, nót B l¹i cã hai nót con :
LChild cña B lµ D cßn RChild cña B
lµ E ... vv

6

6


7

Root
A
B

C

D

H

E

I


K

G

L

R

M

Q

X

N

H×nh 5.2 C©y nhÞ
ph©n
7

7


8

Đối với một cây nhị phân ta có các
kết quả sau đây [2]:
1 - Số lợng tối đa các nút ở mức I
của cây là:

2 I+1
(I>= 1)
2 - Số lợng tối đa các nút trên một
cây nhị phân có chiều cao h (h là
số mức lớn nhất của nút có trên
cây) đợc xác định bằng công
thức:
2h - 1
(h>=1)
phơng pháp Lu trữ cây nhị phân

Đối với cây nhị phân ngời ta thờng
dùng 2 phơng pháp lu trữ:
Phơng pháp lu trữ kế tiếp bằng
mảng
8

8


9

Phơng pháp lu trữ bằng danh sách
liên kết
Phơng pháp lu trữ kế tiếp bằng
mảng

Xét cây nhị phân mà giá trị mỗi
nút là một chữ số
Root

1

A

2 B
4

9

D

3
5

8

9

H

I

E

6 G

10
K

C


11 12
L

R

7 M
13
Q

14 15
X

N

9


10

Hình 5.3
Ta lần lợt đánh số cho các nút từ
mức 1 trở đi, hết mức này sang
mức khác và từ trái sang phải từ 1
đến 15
Nh vậy nút con của nút thứ I sẽ là
nút thứ 2i và 2i +1.
Ta sẽ lu trữ cây nhị phân trong
một mảng gồm 15 thành phần
theo qui tắc:

Nút thứ i của cây sẽ đợc lu trữ ở
thành phần [ i-1] của mảng. Đây
chính là phơng pháp lu trữ kế
tiếp. Hình ảnh lu trữ cây nhị
phân trên đây bằng mảng nh sau
( Hình 5.4 ) :

10

10


11
Đ ịa chỉ

Vù ng nhớ

Phần tử mảng

1

Base (B)+0
Base (B)+1
Base (B)+2
Base (B)+3
Base (B)+4
Base (B)+5

...........


.................
Base(B)+8
Base (B)+9
Base (B)+14

11001010111001
15

Hình 5.4
Khi biết địa chỉ của một
nút, chúng ta có thể tính đợc địa
chỉ các nút con của nó. Ví dụ: Nút
C chứa ở nút E [ 3] có địa chỉ là 3.
Hai nút con của nó có địa chỉ là:3
x 2 = 6 và 3 x 2 +1 = 7 .
11

11


12

Dễ dàng thấy rằng trong trờng hợp lu trữ nh trên đây thì
đối với cây nhị phân không đầy
đủ, có nhiều cây con rỗng thì ta
phải lu trữ nhiều phần tử rỗng
( mà ta qui ớc ký hiệu là phần tử )
. Phơng pháp lu trữ kế tiếp, trong
các trờng hợp cây nhị phân lớn,
không đầy đủ sẽ dẫn đến tốn rất

nhiều ô nhớ ( Vì phải chứa tất cả
các thành phần rỗng).
Chẳng hạn xét cây nhị
phân không đầy đủ sau đây:

12

12


13

1 12
2 20
4 60

8

2

3 7
5 2

9

7

6

10


11

9

7

11

65

6

Hình 5.5
Rõ ràng là trong trờng hợp
này chúng ta phải lu trữ thêm 4 nút
trống. Đó là RChild của nút 4 ,
RChild của nút 5, RChild của nút 6
và RChild của nút 7. Nếu cây nhị
phân có kích thớc lớn thì việc phải
lu trữ nhiều phần tử rỗng một cách
vô ích nh vậy là rất tốn kém bộ nhớ
13

13


14

và không hiệu quả trong giải thuật

xử lý.
Phơng pháp Lu trữ bằng danh sách
liên kết

Trong trờng hợp này mỗi nút sẽ đợc
lu trữ theo cấu trúc sau đây:
L
Child

Data

RChil
d

Trờng Data chứa dữ liệu của nút.
Trờng LChild là con trỏ, trỏ tới cây
con trái của nút.
Trờng RChild là con trỏ, trỏ tới cây
con phải của nút.
Ví dụ : Cho cây nhị phân nh
trong hình vẽ dới đây
14

14


15

1 12
2 20

4 60

8

2

3 7
5 21

9

7

6

10

11

9

7

11

65

6

H×nh 5.6

C©y nµy sÏ ®îc lu tr÷ theo qui t¾c
sau ®©y:
NÕu mét nót P nµo ®ã lµ tËn cïng
kh«ng cã nót con th×:
P^. Child = NIL
P ^. Child = NIL.
15

15


16

Ta dùng con trỏ T ,trỏ tới gốc của
cây nhị phân để truy nhập cây
từ gốc,nếu cây rỗng thì T = nil.

Root
12

20

7

60

21

11


65

2

7

9

6

Hình 5.7
16

16


17

5.3 phơng pháp quét cây nhị
phân

Việc quét một cây nhị phân
một cách đệ qui đòi hỏi ba bớc cơ
bản mà chúng ta qui ớc ký hiệu là
N,L,R ( N-thăm nút,L-thăm nút trái,
R- thăm nút phải) . Trong thực tế có
thể có 6 trình tự khác nhau :
LNR,NLR,LRN,NRL,RNL,RLN
Ba thứ tự đầu tiên là những
thứ tự quan trọng nhất trong 6 cách

quét và chúng đợc gọi một cách
phổ biến bằng các tên khác:
LNR Trung tự (Inorder)
NLR Tiền tự ( Preorder)
LRN Hậu tự (Postorder)
HI
Phơng pháp quét theo thứ tự tiền
tự đợc định nghĩa một cách đệDE F
B C
qui nh sau:
A

17

17


18

1 - Th¨m gèc
2 - quÐt c©y con tr¸i theo
tù tiÒn tù
3 - quÐt c©y con ph¶i theo
tù tiÒn tù
QuÐt theo trung tù:
1 - QuÐt c©y con tr¸i theo
tù trung tù
2 - Th¨m gèc
3 - QuÐt c©y con ph¶i theo
tù trung tù.


thø
thø
thø
thø

QuÐt theo hËu tù :
1 - QuÐt c©y con tr¸i theo thø
tù hËu tù

18

18


19

1

A

2 B
4 E

3
5

F

6


G

C
7

H

Hình 5.8
2 - Quét cây con phải theo thứ
tự hậu tự
3 - Thăm gốc
Xét cây nhị phân biểu diễn ở
trên:
Nếu quét cây theo tiền tự, trình
tự các nút sẽ thăm là:
A B E FC G H
Trình tự quét cây thứ tự trung tự:
19

19


20

EB F A G C H
Trình tự quét cây theo thứ tự hậu
tự:
E F


B G H C A

Giải thuật quét một cây nhị phân

Để quét một cây nhị phân ta
dùng một Stack để nạp địa chỉ
các nút cần thiết khi đi xuống
theo một nhóm nào đó và lấy các
địa chỉ đó ra khỏi Stack để xác
định đờng đi lên [2]
Cho T là con trỏ, trỏ tới gốc một
cây, S là một Stack tổ chức theo
kiểu kế tiếp với Top trỏ tới đỉnh.
Con trỏ P dùng để trỏ tới nút hiện
đang đợc xem xét.
1 - Giải thuật quét theo tiền tự
20

20


21

Trong trờng hợp này khi thăm
gốc xong thì địa chỉ gốc cây
con phải của nút đợc lu trữ vào
Stack.
Giải thuật nh sau :
Procedure
VisitTreePreorder

(T
:
PointerType );
Var
Top: PointerType;
S: StackType;
P: ElementType;
begin
If T= nil then
Begin Write
(cây rỗng)
Else
21

21


22

begin
Top : = 0;
InsertStack
( S,Top,T);
End;
(B¾t ®Çu
duyÖt c©y)
While Top >0 do
Begin
P :=
DeleteStack (S,Top );

(LÊy mét
phÇn tö khái Stack )
(Th¨m nót
råi xuèng con tr¸i)
While P <
> nil do
Begi
n
22

22


23

Write
(P^. Data);
if P^. Rptr
< > nil Then
insertStack
(S,Top, p^. RChild);
(Lu trữ địa chỉ
gốc cây con phải)
P : = P^. LChild;
(xuống gốc trái)
End;
end;
End;
2 - Giải thuật quét theo thứ tự
hậu tự


23

23


24

Trong trờng hợp này nút gốc
chỉ đợc thăm sau khi đã duyệt
xong hai nút con của nó. Nh vậy
chỉ khi từ nút con phải đi lên gốc
mới đợc thăm (đi từ cây con trái lên
gốc không đợc thăm). Để phân
biệt, ta đa thêm dấu âm vào địa
chỉ phải để đánh dấu đờng đi
lên từ cây con phải.
Procedure
VisitTreePostorder
(T
PointerType );
Var
P,Top: PointerType;
Begin
If T= nil then
Write (cây rỗng);
Else
Begin
24


:

24


25

Top : =0;
P : = T;
End;
(Bắt đầu duyệt cây)
While P < > nil do
Begin
InsertStack
( S,Top,p);
P : = P^. LChild;
End;
(Thăm nút mà con trái và
con phải đã duyệt)
While S [Top] < 0 do
Begin
P : =
InsertStack (S,Top);
Write (P^.
Data);
If Top = 0 then
write( cây rỗng);
25

25



×