GV: NGUYỄN XUÂN VINH
CẤU TRÚC DỮ LIỆU
DATA STRUCTURES
MÔN: CẤU TRÚC DỮ LIỆU
[214331]
TREE
Nguyễn Xuân Vinh
1
/XX
12/3/15
2
/XX
12/3/15
MÔN: CẤU TRÚC DỮ LIỆU
GV: NGUYỄN XUÂN VINH
Cấu trúc dữ liệu
Linear
-
Hierarchical structures
2
Cấu trúc cây
Cây nhị phân
Cây nhị phân tìm kiếm
3
/XX
12/3/15
MÔN: CẤU TRÚC DỮ LIỆU
GV: NGUYỄN XUÂN VINH
Nội dung
-
3
GV: NGUYỄN XUÂN VINH
Tập hợp các nút và cạnh nối các nút đó
Có một nút gọi là gốc
Quan hệ one-to-many giữa các nút
Có duy nhất một đường đi từ gốc đến một nút
Các loại cây:
Nhị phân: mỗi nút có {0,1, 2} nút con
Tam phân: mỗi nút có {0,1,2,3} nút con
n-phân: mỗi nút có {0,1,..,n} nút con
4
/XX
12/3/15
MÔN: CẤU TRÚC DỮ LIỆU
Cấu trúc cây
-
4
5
/XX
12/3/15
MÔN: CẤU TRÚC DỮ LIỆU
GV: NGUYỄN XUÂN VINH
Cấu trúc cây
5
6
/XX
12/3/15
MÔN: CẤU TRÚC DỮ LIỆU
GV: NGUYỄN XUÂN VINH
Khái niệm
Cạnh
Q
-
J
Z
B
K
A
gốc
nút
A
R
D
F
L
Lá
6
MÔN: CẤU TRÚC DỮ LIỆU
GV: NGUYỄN XUÂN VINH
Thuật ngữ
Root node: nút gốc: không có nút cha
Leaf node: nút lá: không có nút con
Internal node: nút trong: không phải nút con và nút gốc
Height: chiều cao: khoảng cách từ gốc đến lá
Parent node (or ancestor, or superior): nút cha
Child nodes (successor): nút con
Nút gốc
1
/XX
12/3/15
Nút trong
5
3
6
Chiều cao
4
7
8
7
Nút lá
2
-
7
GV: NGUYỄN XUÂN VINH
Thuật ngữ
Root
MÔN: CẤU TRÚC DỮ LIỆU
Node A
Node C
Node E
Node I
Node F
Node J
Node G
Node K
12/3/15
Node H
Node D
Node B
/XX
Node L
8
Cây con
-
Nút anh em
8
GV: NGUYỄN XUÂN VINH
Ví dụ cây
9
/XX
12/3/15
MÔN: CẤU TRÚC DỮ LIỆU
•
Một số loại cây thường gặp:
–
–
–
–
Cây nhị phân.
Cây quyết định.
Cây biểu thức.
Cây đỏ đen.
GV: NGUYỄN XUÂN VINH
MÔN: CẤU TRÚC DỮ LIỆU
12/3/15
/XX
10
Nội dung
Cấu trúc cây
Cây nhị phân
Cây nhị phân tìm kiếm
Cây nhị phân tìm kiếm cân bằng AVL
GV: NGUYỄN XUÂN VINH
Cấu trúc cây đơn giản nhất
Tại mỗi nút gồm các 3 thành phần
Phần data: chứa giá trị, thông tin…
Liên kết đến nút con trái (nếu có)
Liên kết đến nút con phải (nếu có)
Cây nhị phân có thể rỗng (ko có nút nào)
Cây NP khác rỗng có 1 nút gốc
Có duy nhất 1 đường đi từ gốc đến 1 nút
Nút không có nút con bên trái và con bên phải là nút lá
11
/XX
12/3/15
MÔN: CẤU TRÚC DỮ LIỆU
Cây nhị phân (Binary Tree)
-
11
GV: NGUYỄN XUÂN VINH
Binary Tree
Kích thước = 9 (số nút)
Mức 0
A
Cây con phải
Cây con trái
MÔN: CẤU TRÚC DỮ LIỆU
Mức 1
B
C
Mức 2
E
F
G
Mức 3
Độ sâu/chiều cao = 3
H
I
12
/XX
12/3/15
D
-
12
Cây nhị phân đúng:
Nút gốc và nút trung gian có đúng 2 con
Cây nhị phân đúng có n nút lá thì số nút trên cây 2n-1
MÔN: CẤU TRÚC DỮ LIỆU
GV: NGUYỄN XUÂN VINH
Binary Tree
A
B
E
F
G
/XX
12/3/15
D
C
I
J
K
13
H
-
13
Cây nhị phân đầy đủ với chiều sâu d
Phải là cây nhị phân đúng
Tất cả nút lá có chiều sâu d
MÔN: CẤU TRÚC DỮ LIỆU
GV: NGUYỄN XUÂN VINH
Binary Tree
Số nút = (2
d+1
A
-1)
Số nút trung gian = ?
Biết số nút tính d của cây NP đầy đủ
B
E
F
14
/XX
12/3/15
D
C
-
14
G
Duyệt cây:
Do cây là cấu trúc phi tuyến tính
3 cách duyệt cây nhị phân
Duyệt theo thứ tự trước PreOrder: NLR
Duyệt theo thứ tự giữa InOrder: LNR
Duyệt theo thứ tự sau PostOrder: LRN
MÔN: CẤU TRÚC DỮ LIỆU
GV: NGUYỄN XUÂN VINH
Binary Tree
A
B
E
F
15
/XX
12/3/15
D
C
-
15
G
GV: NGUYỄN XUÂN VINH
Binary Tree
P
S
MÔN: CẤU TRÚC DỮ LIỆU
D
A
Pre-order (trước):
PDAMSWT
Post-order (sau):
AMDTWSP
In-order (giữa):
ADMPSTW
M
W
T
16
/XX
12/3/15
Level-Order (rộng): P D S A M W T
-
16
GV: NGUYỄN XUÂN VINH
MÔN: CẤU TRÚC DỮ LIỆU
12/3/15
/XX
17
Cài đặt cây
Cây có thể được cài đặt bằng:
Mảng
Danh sách con
Theo con trái nhất và anh em ruột phải
Danh sách liên kết
GV: NGUYỄN XUÂN VINH
MÔN: CẤU TRÚC DỮ LIỆU
12/3/15
/XX
18
Cài đặt cây: bằng mảng
Cách 1: Nếu cây T có n nút, ta gán tên các nút lần lượt là 0,1,2,..n-1 sau đó ta dùng 2 mảng A và L để lưu trữ cây
bằng cách:
Cho A[i] = j với j là nút cha của nút i.
A[i] = -1 nếu i là nút gốc.
L[i] = x với x là nhãn của nút thứ i.
18
Cách 2:
Dùng 1 mảng A là mảng các nút mà mỗi nút bao gồm:
Biến parent dùng để lưu trữ chỉ số của nút cha.
Biến data dùng để lưu trữ thông tin của nút đó.
Một biến maxNode để giữ số nút hiện tại đang có trên cây.
19
/XX
12/3/15
MÔN: CẤU TRÚC DỮ LIỆU
GV: NGUYỄN XUÂN VINH
Cài đặt cây: bằng mảng
19
GV: NGUYỄN XUÂN VINH
MÔN: CẤU TRÚC DỮ LIỆU
12/3/15
/XX
20
Cài đặt cây: bằng mảng
Nhận xét:
hàm PARENT(n,T) tốn chỉ một hằng thời gian để lấy ra cha của nút n trong cây T.
Các hàm đòi hỏi thông tin về các con không làm việc tốt vì phải tốn vòng lặp để dò tìm.
Tìm nút con trái nhất của nút i là không thể xác định được.
Cách khắc phục qui ước cách đánh 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.
20
GV: NGUYỄN XUÂN VINH
Cài đặt cây: bằng danh sách con
Mỗi nút có 1 danh sách các nút con
Danh sách có thể được cài đặt bằng bất cứ cách nào ta biết. Tuy nhiên dùng danh sách liên kết sẽ thích hợp hơn vì
21
/XX
12/3/15
MÔN: CẤU TRÚC DỮ LIỆU
số nút con ta chưa biết trước.
Nhận xét:
Hàm đòi hỏi thông tin về các con làm việc rất thuận lợi
Hàm PARENT, Root lại không làm việc tốt. Nó đòi hỏi ta phải duyệt tất cả các danh sách chứa các nút con.
21
22
/XX
12/3/15
MÔN: CẤU TRÚC DỮ LIỆU
GV: NGUYỄN XUÂN VINH
Cài đặt cây: bằng danh sách con
22
GV: NGUYỄN XUÂN VINH
MÔN: CẤU TRÚC DỮ LIỆU
12/3/15
/XX
23
Cài đặt cây: theo con trái nhất và anh em ruột phải
Các cấu trúc đã dùng để mô tả cây ở trên không trợ giúp phép tạo một cây lớn từ các cây nhỏ hơn (createI)
Ta thay thế mảng các header bằng mảng CELLSPACE chứa các struct có ba trường:
LABELS giữ nhãn của nút
LEFTMOST_CHILD là nút con trái nhất của nó.
RIGHT_SIBLING là nút anh ruột phải.
Hơn nữa mảng này giữ tất cả các nút của tất cả các cây.
23
GV: NGUYỄN XUÂN VINH
Cài đặt cây: bằng danh sách liên kết
8
MÔN: CẤU TRÚC DỮ LIỆU
pTree
5
12/3/15
1
10
3
20
7
24
/XX
9
4
-
24
GV: NGUYỄN XUÂN VINH
Các thao tác:
NewNode, FreeNode, Init, IsEmpty
InsertLeft, InsertRight
DeleteLeft, DeleteRight
PreOrder, InOrder, PostOrder
Search
ClearTree
25
/XX
12/3/15
MÔN: CẤU TRÚC DỮ LIỆU
Binary Tree
-
25