Tải bản đầy đủ (.pdf) (32 trang)

Chương 5 Cấu trúc dữ liệu cây

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 (656.45 KB, 32 trang )

Chương 5
Cấutrúcdữ liệucây
Cấu

trúc

dữ

liệu

cây
5.1. Định nghĩa


ột


t
đó
b

á
út
đượ

y

m
ột
c


u
t
r
ú
c
t
rong
đó
b
ao g

mc
á
cn
út
đượ
c
liên kếtvới nhau theo hệ thống phân cấp, trong đónút
có cấp cao nhất đượcgọilànútgốcvànútcócấpthấp
nhất
được
gọi

các
nút

nhất
được
gọi


các
nút

.
19/12/2008 2Cấu trúc dữ liệu 1
5.1. Định nghĩa
19/12/2008 3Cấu trúc dữ liệu 1
5.1. Định nghĩa

Thuật
ngữ
:

Thuật
ngữ
:
- Nút cha (parents node) củamột node là nút có cấp
cao
hơn

một
bậc
cao
hơn

một
bậc
.
- Nút con (child node) củamộtnodelànútcócấpnhỏ
hơn


một
bậc
hơn

một
bậc
.
-Nútgốc (root) là nút không có nút cha.
- Nút lá (leaf – leaves) là nút không có nút con.
-C
ấp
của1nút
(
level of
a
node
)
l
à
các liên k
ế
t đ

đi
p
(
)
từ nút gốc đến nút đó.
19/12/2008 4Cấu trúc dữ liệu 1

5.2. Cây nhị phân
5
2
1
Khái
niệm
về
cây
nhị
phân
5
.
2
.
1
.
Khái
niệm
về
cây
nhị
phân

Cây nhị
p
hân là mộtcâymàm

i nút có không quá 2 nút
con
19/12/2008 5Cấu trúc dữ liệu 1

5
2
2
Cây
nhị
phân
tìm
kiếm
5.2. Cây nhị phân tìm kiếm
5
.
2
.
2
.
Cây
nhị
phân
tìm
kiếm
Cây nhị phân tìm kiếmlàmột cây nhị phân trong đónút
của

được
tổ
chức
để
luôn
thỏa
tính

chất
sau
đây

Giá
của

được
tổ
chức
để
luôn
thỏa
tính
chất
sau
đây
Giá
trị của nút cha luôn lớnhơn giá trị tấtcả nút con bên
trái và nhỏ hơn giá trị củatấtcả nút con bên phải”.
19/12/2008 6Cấu trúc dữ liệu 1
5
2
2
Cây
nhị
phân
tìm
kiếm
5.2. Cây nhị phân

5
.
2
.
2
.
Cây
nhị
phân
tìm
kiếm
19/12/2008 7Cấu trúc dữ liệu 1
5
2
2
Cây
nhị
phân
tìm
kiếm
5.2. Cây nhị phân
5
.
2
.
2
.
Cây
nhị
phân

tìm
kiếm
Biểu
diễn
cây
nhị
phân
tìm
kiếm
Biểu
diễn
cây
nhị
phân
tìm
kiếm
struct Node
{
int key;
Node * left, * right;
}
;
}
;
typedef Node *pNode;
tt
T
s
t
ruc

t
T
ree
{
pNode root;
19/12/2008 8Cấu trúc dữ liệu 1
};
5
2
2
Cây
nhị
phân
tìm
kiếm
5.2. Cây nhị phân
5
.
2
.
2
.
Cây
nhị
phân
tìm
kiếm
Các
thao
tác

trên
cây
nhị
phân
tìm
kiếm
Các
thao
tác
trên
cây
nhị
phân
tìm
kiếm
Khởitạocây
id
iti l
(
t)
vo
id
In
iti
a
l
(
Tree
&t)
{

t.root
=
N
ULL
;
}
Kiểmtracâyrỗng
int isEmpty (Tree t)
{
return
(t
root
==
NULL)
;
19/12/2008 9Cấu trúc dữ liệu 1
return
(t
.
root
==
NULL)
;
}
5
2
2
Cây
nhị
phân

tìm
kiếm
5.2. Cây nhị phân
5
.
2
.
2
.
Cây
nhị
phân
tìm
kiếm
Các
thao
tác
trên
cây
nhị
phân
tìm
kiếm
Các
thao
tác
trên
cây
nhị
phân

tìm
kiếm
Thêm một nút vào cây
Giả sử cần thêm 1 nút có khóa k vào cây t.
-
So
sánh
với
nút
gốc
:
nếu
nhỏ
hơn
thì
sang
trái
lớn
hơn
So
sánh
với
nút
gốc
:
nếu
nhỏ
hơn
thì
sang

trái
,
lớn
hơn
thì sang phải.
-Sosánhvớinútgốccủa cây con bên trái (phải) và lặp
lại
quá
trình
trên
cho
đến
khi
tìm
được
vị
trí
thích
hợp
.
19/12/2008 10Cấu trúc dữ liệu 1
lại
quá
trình
trên
cho
đến
khi
tìm
được

vị
trí
thích
hợp
.
5.2. Cây nhị phân
5
2
2
Cây
nhị
phân
tìm
kiếm
5
.
2
.
2
.
Cây
nhị
phân
tìm
kiếm
Các thao tác trên cây nhị phân tìm kiếm
Thê

ú
à

â
Thê
mm
ột
n
út
v
à
oc
ây
int Ins (pNode &r, int k)
{
//
if (!r)
//
r==NULL
{
pNode p = new Node;
p
>
key
=
k
;
p
-
>
key
=
k

;
p->left=p->right = NULL;
r=p;
return
1
;
return
1
;
}
if (r -> key == k)return 0;
if
(
r->
k
e
y
>
k
)
r
eturn
I
ns
(
r
-
>
left
,

k
)
;
19/12/2008 11Cấu trúc dữ liệu 1
(
y
)
(
,)
else return Ins (r->right,k);
}
5.2. Cây nhị phân
5
2
2
Cây
nhị
phân
tìm
kiếm
5
.
2
.
2
.
Cây
nhị
phân
tìm

kiếm
Các
thao
tác
trên
cây
nhị
phân
tìm
kiếm
Các
thao
tác
trên
cây
nhị
phân
tìm
kiếm
Thêm một nút vào cây
it
t
(
t
it
k)
i
n
t
Inser

t
(
Tree
&t
,
i
n
t
k)
{
return
I
nsert
(
t
.
r
oot,k)
;
}
19/12/2008 12Cấu trúc dữ liệu 1
5.2. Cây nhị phân
5
2
2
Cây
nhị
phân
tìm
kiếm

5
.
2
.
2
.
Cây
nhị
phân
tìm
kiếm
Các
thao
tác
trên
cây
nhị
phân
tìm
kiếm
Các
thao
tác
trên
cây
nhị
phân
tìm
kiếm
Thêm một nút vào cây

it
t
(
t
it
k)
i
n
t
Inser
t
(
Tree
&t
,
i
n
t
k)
{
return
I
ns
(
t
.
r
oot,k);
}
19/12/2008 13Cấu trúc dữ liệu 1

5.2. Cây nhị phân
5
2
2
Cây
nhị
phân
tìm
kiếm
5
.
2
.
2
.
Cây
nhị
phân
tìm
kiếm
Các thao tác trên cây nhị phân tìm kiếm
Tạocây
void CreateTree (Tree &t)
{
int k;
do
{
{
cout<<"Nhap nut can them: “;cin>>k;
if (k!=-1)

if
(Insert(t k))
if
(Insert(t
,
k))
cout<<"Thanh cong"<<endl;
else
cout
<<
"
Nut
da
co
trong
cay
"
<<endl
;
19/12/2008 14Cấu trúc dữ liệu 1
cout
<< Nut
da
co
trong
cay <<endl
;
}while (k!=-1);
}
5.2. Cây nhị phân

5
2
2
Cây
nhị
phân
tìm
kiếm
5
.
2
.
2
.
Cây
nhị
phân
tìm
kiếm
Các thao tác trên cây nhị phân tìm kiếm
Duyệtcây
NLR (Node – Left – Right):
44 18 13 15 37 23 40 88 59 55 71 108
LNR (Left – Node – Right):
13 15 18 23 37 40 44 55 59 71 88 108
LRN (Left – Right – Node):
15 13 23 40 37 18 55 71 59 108 88 44
19/12/2008 15Cấu trúc dữ liệu 1
5.2. Cây nhị phân
5

2
2
Cây
nhị
phân
tìm
kiếm
5
.
2
.
2
.
Cây
nhị
phân
tìm
kiếm
Các thao tác trên cây nhị phân tìm kiếm
Duyệtcây
void LNR (pNode r)
{
{
if (!r)
return;
lnr(r
-
>left)
;
lnr(r

-
>left)
;
cout<<r->key<<" ";
lnr(r->right);
}
}
void LNR(Tree t)
{
LNR(t
t)
19/12/2008 16Cấu trúc dữ liệu 1
LNR(t
.roo
t)
;
}
5.2. Cây nhị phân
5
2
2
Cây
nhị
phân
tìm
kiếm
5
.
2
.

2
.
Cây
nhị
phân
tìm
kiếm
Các thao tác trên cây nhị phân tìm kiếm
Tìm khóa k có trong cây hay không
int Search(pNode r,int k)
{
{
if (!r) return 0;
if (r->key == k) return 1;
if (r->key
>
k
)
return Search(r->left,k);
else
return Search(r->right,k);
}
int Search(Tree t,int k)
{
19/12/2008 17Cấu trúc dữ liệu 1
{
return Search(t.root,k);
}
5.2. Cây nhị phân
5

2
2
Cây
nhị
phân
tìm
kiếm
5
.
2
.
2
.
Cây
nhị
phân
tìm
kiếm
Các thao tác trên cây nhị phân tìm kiếm
Xóa một nút X
- X là nút lá: chỉđơngiảnhủy X vì nó không móc nối
đế
hầ
à
khá
đế
n
phầ
nt


n
à
o
khá
c.
19/12/2008 18Cấu trúc dữ liệu 1
5.2. Cây nhị phân
5
2
2
Cây
nhị
phân
tìm
kiếm
5
.
2
.
2
.
Cây
nhị
phân
tìm
kiếm
Các thao tác trên cây nhị phân tìm kiếm
Xóa một nút X
- Xchỉ có1nútcon:trướckhihủyXtamócnốichacủa
ới

d
hấ
ó
Xv
ới
con
d
uy n
hấ
tcủan
ó
.
19/12/2008 19Cấu trúc dữ liệu 1
5.2. Cây nhị phân
5
2
2
Cây
nhị
phân
tìm
kiếm
5
.
2
.
2
.
Cây
nhị

phân
tìm
kiếm
Các thao tác trên cây nhị phân tìm kiếm
Xóa một nút X
-Xcóđủ cả 2con: không thể hủytrựctiếpdoXcóđủ 2
ế

con ⇒ hủygiánti
ế
p. Thay vì hủyX,tasẽ tìm một
p
h

n
tử thế mạng Y. Phầntử nàycótối đamột con. Thông tin
l
t i
Y

đ
h ể

l
t i
X
S
đó
út
bị

l
ưu
t

i
Y
s

đ
ượcc
h
uy

n

n
l
ưu
t

i
X
.
S
au
đó
,n
út
bị
hủythậtsự sẽ là Y giống như 2trường hợp đầu. Vấn đề


phải
chọn
Y
sao
cho
khi
lưu
Y
vào
vị
trí
của
X
cây

phải
chọn
Y
sao
cho
khi
lưu
Y
vào
vị
trí
của
X
,

cây
vẫnlàCNPTK.Có2phầntử thỏamãnyêucầu:
+
Phần
tử
nhỏ
nhất
(
trái
nhất
)
trên
cây
con
phải
19/12/2008 20Cấu trúc dữ liệu 1
+
Phần
tử
nhỏ
nhất
(
trái
nhất
)
trên
cây
con
phải
.

+Phầntử lớnnhất(phảinhất) trên cây con trái.
5.2. Cây nhị phân
5
2
2
Cây
nhị
phân
tìm
kiếm
5
.
2
.
2
.
Cây
nhị
phân
tìm
kiếm
Có thể dùng 15
để thế mạng
19/12/2008 21Cấu trúc dữ liệu 1
để

thế

mạng
5.2. Cây nhị phân

5
2
2
Cây
nhị
phân
tìm
kiếm
5
.
2
.
2
.
Cây
nhị
phân
tìm
kiếm
Có thể dùng 15
để thế mạng
19/12/2008 22Cấu trúc dữ liệu 1
để

thế

mạng
5.2. Cây nhị phân
5
2

3
Cây
nhị
phân
cân
bằng
5
.
2
.
3
.
Cây
nhị
phân
cân
bằng
Định nghĩa
Cây cân bằng hoàn toàn là cây nhị phân tìm kiếmmà
tạimỗi nút củanó,số nút của cây con trái chênh lệch
kh
á
ới

ú
h i
kh
ông qu
á
một so v

ới
s

n
ú
t của cây con
ph

i
.
Cây Cân Bằng Hoàn Toàn
Cây CCBHT thì h ~ log
2
n
19/12/2008 23Cấu trúc dữ liệu 1
Cây nhị phân tìm kiếm cân bằng hoàn toàn
5.2. Cây nhị phân
5
2
3
Cây
nhị
phân
cân
bằng
5
.
2
.
3

.
Cây
nhị
phân
cân
bằng
Nhậnxét
• Mộtcâyrất khó đạt đượctrạng thái cân bằng hoàn toàn và cũng
rấtdễ mấtcânbằng vì khi thêm hay hủy các nút trên cây có thể





làm cây m

tcânb

ng (xác su

tr

tlớn), chi
p
hí cân b

ng lại cây
lớnvìphải thao tác trên toàn bộ cây.

Trong

trường
hợp
xấu
nhất
ta
chỉ
phải
tìm
qua
log
n
phần
tử
(n

Trong
trường
hợp
xấu
nhất
ta
chỉ
phải
tìm
qua
log
2
n
phần
tử

(n
là số nút trên cây).

Do
CCBHT

một
cấu
trúc
kém
ổn
định
nên
trong
thực
tế
không
Do
CCBHT

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ểmcủanólạirấtquantrọng. Vì vậy, cần
đưaramột CTDL khác có đặc tính giống CCBHT nhưng ổn định
h
19/12/2008 24Cấu trúc dữ liệu 1
h
ơn.
5.2. Cây nhị phân
5
2
3
Cây
nhị
phân
cân
bằng
5
.
2
.
3
.
Cây
nhị
phân
cân
bằng
Cây AVL (Adelson – Velskii – Landiis)
Định nghĩa: Cây nhị phân tìm kiếmcânbằng là cây mà
t


imỗinútcủanóđ

cao của câ
y
con trái v
à
củ
a

y
con


y
y
phải chênh lệch không quá một.
Cây AVL
19/12/2008 25Cấu trúc dữ liệu 1
Cây nhị phân tìm kiếm cân bằng AVL

×