Professional Documents
Culture Documents
Ngon-Ngu-Lap-Trinh - Vu-Song-Tung - Chuong11 - Cautruccay - (Cuuduongthancong - Com)
Ngon-Ngu-Lap-Trinh - Vu-Song-Tung - Chuong11 - Cautruccay - (Cuuduongthancong - Com)
om
LẬP TRÌNH
.c
ng
Phần 3: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT
co
an
th
Chương 11: Cấu trúc cây ng
o
du
u
cu
om
– Các khái niệm cơ bản trong cây
.c
– Các tính chất cơ bản
ng
– Các thao tác cơ bản
co
• Cây nhị phân (binary tree)
an
– Khái niệm
th
ng
– Phân loại
o
om
• Cài đặt cây nhị phân
.c
– Dùng cấu trúc lưu trữ móc nối
ng
– Dùng cấu trúc lưu trữ tuần tự
co
• Duyệt cây nhị phân
an
– Phép thăm và duyệt
– Các phép duyệt cây th
o ng
• Duyệt theo thứ tự trước
du
om
• nút (node)
.c
• gốc (root)
ng
– Các quan hệ phân cấp giữa các cặp nút.
co
tail
• nhánh
an
root
• quan hệ cha-con tree
th
• quan hệ cấp trên-cấp dưới
ng
nodes
– Cây rỗng
o
du
parent
u
cu
child
Leaves (childless
nodes)
Bộ Môn ĐT-KTMT - Viện ĐT-VT. Chương 11: Cấu trúc cây 4
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Các khái niệm cơ bản
• Giới thiệu chung – Ví dụ
– Ví dụ về các tiêu đề
om
– Ví dụ thư mục trong windows
.c
ng
4
co
C Users
an
Windows
Temp
th
o ng
Program Files 4.1
du
4.2
u
cu
om
– Cấp của một nút (degree): là số con mà nút này có d(A)
.c
– Cấp của cây: d(T)
ng
• là cấp của nút có số con nhiều nhất trên cây 1
co
– Nút nhánh (node-branch node)
an
• là nút có ít nhất một con
th
• tên gọi khác: nút trong, nút không tận cùng
ng 2 7
– Nút lá (leaf node or terminal node)
o
• là nút không có con nào
du
om
Độ sâu (degree)
2
.c
• h(A) = L(A)-1 7
ng
– Chiều cao của cây: h(T)
co
• là chiều cao của nút cao nhất trong cây
3 4 5 6
– Đường đi giữa nút gốc và một nút khác
an
th
(path): p(A)
• là dãy các nhánh nối từ gốc đến nút đó 8
ng
– Độ dài đường đi (path length): PL(A)
o
du
• Thực tế: nhánh thường là khái niệm logic biểu diễn quan hệ phân cấp giữa
cu
một cặp nút, nên không có độ dài. Vì vậy, thường quy ước độ dài của tất
cả các nhánh trong một cây đều bằng 1 (đơn vị). Khi đó, độ dài đường đi
tương đương với chiều cao
om
– Cây được sắp (có thứ tự - ordered tree)
.c
• Có thứ tự (ordered tree): có trật tự tuyến tính
ng
giữa các nút con
co
• Không có thứ tự (unordered tree): không có trật 1
an
tự tuyến tính
th
– Rừng (forest) ng
• là cấu trúc bao gồm nhiều cây 2 7
o
du
3 4 5 6
8
Bộ Môn ĐT-KTMT - Viện ĐT-VT. Chương 11: Cấu trúc cây 8
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Các khái niệm cơ bản
• Giới thiệu chung – Các tính chất cơ bản
1
– Số nút của cây bằng số nhánh cộng 1
om
– Cây có tính chất đệ quy. Tính chất này sẽ
.c
được sử dụng trong nhiều thao tác sau này. 2
ng
7
– Cây là một cấu trúc dữ liệu động, tức là
co
kích thước của nó (số nút của cây) có thể
an
thay đổi. 3 4 5 6
th
– Cấu trúc cây không còn cấu trúc tuyến tính
ng
nữa mà là cấu trúc phân cấp. 8
o
du
om
– Bổ sung một nút mới vào cây 1
.c
• Xác định vị trí
ng
• Xác định quan hệ nút mới và nút tại vị trí bổ sung
co
– Lấy ra một nút 2 7
an
• Xác định vị trí
th
• Cấu trúc lại cây ng
– Tìm cha mỗi đỉnh 3 4 5 6
o
• Parent(x)
du
– Tìm con bên trái ngoài cùng (con trưởng) của mỗi đỉnh 8
u
• EldestChild(x)
cu
om
• Preorder: 1, 2, 4, 3, 5, 7, 6, 8, 9
.c
a
ng
=> a, b, c, d
co
b c d 1
an
• Inorder: 4, 2, 3, 5, 1, 8, 6, 7, 9 : Thường chỉ dùng
th
với cây NP
2
ng
b 7
o
=> a, b, c, d
du
a c d
u
• Postorder: 4, 3, 5, 2, 8, 6, 9, 7, 1 4 3 5 6 9
cu
d
=> a, b, c, d 8
a b c
om
• MergeTree(T1,T2,x): x=1
.c
• Vai trò của x: nút ghép, gốc của T2 sẽ là con của x, và ta có thể ghép
ng
trái, ghép phải
co
– Cắt cây
1
an
• CutTree(T1,x,T2): x=2
th
1
2
ng
2 7
o
du
7
u
3 4 5
cu
6 3 4 5 6
T2 T1
8 8
Bộ Môn ĐT-KTMT - Viện ĐT-VT. Chương 11: Cấu trúc cây 12
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Cây nhị phân (binary tree)
• Mô tả cây nhị phân và các khái niệm cơ bản
– Cây có thứ tự và là cây cấp hai, tức là mỗi nút có tối đa 2 con.
om
– Hai con của một nút được phân biệt thứ tự và quy ước nút
.c
trước gọi là nút con trái và nút sau được gọi là nút con phải
ng
co
– Khi biểu diễn cây nhị phân, ta cũng 1
cần có sự phân biệt rõ ràng giữa
an
con trái và con phải, nhất là khi nút
chỉ có một con. th
ng
2 3
o
du
u
cu
4 5 6 7
8
Bộ Môn ĐT-KTMT - Viện ĐT-VT. Chương 11: Cấu trúc cây 13
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Cây nhị phân (binary tree)
• Mô tả cây nhị phân và các khái niệm cơ bản
– Loại nút:
om
• Nút có đủ hai con được gọi là nút kép: 2, 3
.c
• Nút chỉ có một con gọi là nút đơn: 7
ng
• Nút không có con được gọi là nút lá: 4, 5, 6, 8
co
1
– Cây con có gốc là nút con trái/phải được Phải
an
gọi là cây con trái/phải. (Right)
th
ng Trái
(Left) 2 3
o
du
u
cu
4 5 6 7
8
Bộ Môn ĐT-KTMT - Viện ĐT-VT. Chương 11: Cấu trúc cây 14
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Cây nhị phân (binary tree)
• Các thao tác cơ bản
– Cây nhị phân cũng có các thao tác cơ bản tương tự như của cây
om
tổng quát.:
.c
• Khởi tạo: chuẩn bị CTLT để lưu trữ cấu trúc cây
ng
• Bổ sung một nút mới vào cây
co
• Lấy ra một nút
an
• Tìm cha mỗi đỉnh: Parent(x)
th
• Tìm con bên trái của mỗi đỉnh: LeftChild(x)
ng
• Tìm con bên phải của mỗi đỉnh: RightChild(x)
o
• Ghép cây
du
• Cắt cây
u
• Duyệt cây
cu
om
biến về cấu trúc danh sách.
.c
– Như vậy, danh sách chỉ là dạng suy biến, trường hợp đặc biệt
ng
của cấu trúc cây, và nó vẫn giữa được tính chất đệ quy của cây
co
an
1 1 1
th
ng
2
o
2 2
du
u
cu
3
3 3
4
Bộ Môn ĐT-KTMT - Viện ĐT-VT. Chương 11: Cấu trúc cây 16
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Cây NP - Các trường hợp đặc biệt
• Cây đầy đủ (full binary tree)
om
– Là cây nhị phân có số nút tối đa ở tất cả các mức. Tức là ở mức
i sẽ có đúng 2i-1 nút. Do đó, nếu cây nhị phân có chiều cao h thì
.c
kích thước của nó là: S(T) = 20+21+…+2h = 2h+1-1 ;
ng
co
1 1
an
th
ng
2 3 2 3
o
du
u
cu
4 5 6 7
om
• T là cây đầy đủ đến chiều cao h-1
.c
• Các nút có chiều cao h thì dồn hết về bên trái.
ng
co
1
an
th
ng
2 3
o
du
u
7
cu
4 5 6
8 9 10
om
ta sẽ thu được hai cây con cũng đều là cây nhị phân.
.c
– Gọi h và n lần lượt là chiều cao và kích thước của cây nhị phân
ng
co
thì ta luôn có: log2(n+1) ≤ h+1 ≤ n 1
an
th
1 1
ng
2 3
o
du
2 2
u
3 7
cu
4 5 6
3 4 5 6 7 8 9 10
om
lần lượt từ 1..N, với N là kích thước của cây theo thứ tự như
.c
hình vẽ thì ta có nhận xét sau:
ng
– Tại nút có số thứ tự i: 1
co
• nếu 2i>N: nút i là nút lá
an
• nếu 2i=N: nút i là nút đơn
th
2 3
• nếu 2i<N: nút i là nút kép và
ng
có hai con trái, phải tương ứng là 2i và 2i+1
o
du
om
• Phép thăm một nút (visit): là thao tác truy nhập vào một nút
.c
của cây để xử lý nút đó.
ng
• Phép duyệt (traversal): là phép thăm một cách hệ thống tất
co
cả các nút của cây, mỗi nút đúng một lần.
an
th
o ng
du
u
cu
om
các giải thuật đệ quy để duyệt cây.
.c
• Cây nhị phân T bất kỳ được hình thành từ ba thành phần: gốc, cây con
trái của T và cây con phải của T. Cả ba thành phần này đều là cây nhị
ng
phân. Theo hướng này, ta có 3 giải thuật duyệt cây như sau:
co
– Duyệt theo thứ tự trước (preorder traversal)
an
– Duyệt theo thứ tự giữa (inorder traversal)
th
– Duyệt theo thứ tự sau (postorder traversal)
– Duyệt theo từng mức (tầng) - Duyệt theo chiều rộng
ng
– Hướng thứ hai:
o
du
• Chuyển cấu trúc cây về cấu trúc danh sách. Sau đó đưa bài toán duyệt
cây về bài toán duyệt danh sách đơn giản hơn nhiều.
u
cu
• Theo hướng này, chúng ta sẽ sử dụng một danh sách để lưu các nút của
cây, sau đó sẽ duyệt danh sách.
• Tuỳ theo loại danh sách (hàng đợi, ngăn xếp,…) và thứ tự duyệt trong
danh sách mà chúng ta có những cách duyệt cây khác nhau.
Bộ Môn ĐT-KTMT - Viện ĐT-VT. Chương 11: Cấu trúc cây 22
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Cây nhị phân (binary tree)
• Các thao tác cơ bản - Giải thuật duyệt cây
– Giải thuật duyệt theo thứ tự trước (preorder traversal, còn gọi
om
là duyệt cây theo chiều sâu): đây là giải thuật đệ quy
.c
• Trường hợp đệ quy: để duyệt cây nhị phân T, ta theo các bước sau:
ng
– Thăm gốc
co
T 1
– Duyệt cây con trái theo thứ tự trước
an
– Duyệt cây con phải theo thứ tự trước
th
• Trường hợp điểm dừng:
ng
2 3
– Khi cây T rỗng.
o
du
VD: 1, 2, 4, 8, 9, 5, 10, 3, 6, 7
u
7
cu
4 5 6
8 9 10
om
thuật đệ quy.
.c
• Trường hợp đệ quy: để duyệt cây nhị phân T, ta theo các bước sau:
ng
– Duyệt cây con trái theo thứ tự giữa
co
1
– Thăm gốc
an
– Duyệt cây con phải theo thứ tự giữa
th
• Trường hợp điểm dừng: ng
– Khi cây T rỗng. 2 3
o
du
VD: 8, 4, 9, 2, 10, 5, 1, 6, 3, 7
u
7
cu
4 5 6
8 9 10
om
giải thuật đệ quy.
.c
• Trường hợp đệ quy: để duyệt cây nhị phân T, ta theo các bước sau:
ng
– Duyệt cây con trái theo thứ tự sau
co
1
– Duyệt cây con phải theo thứ tự sau
an
– Thăm gốc
th
• Trường hợp điểm dừng: ng
– Khi cây T rỗng. 2 3
o
• VD: 8, 9, 4, 10, 5, 2, 6, 7, 3, 1
du
u
7
cu
4 5 6
8 9 10
om
thuật không đệ quy:
.c
• Đưa bài toán duyệt cây về duyệt danh sách.
ng
• Để thứ tự duyệt là theo từng mức (từng tầng) và sử dụng một cấu trúc
co
danh sách kiểu hàng đợi Q.
an
// Khởi tạo: Q= .
th
Initialize (Q)
InsertQ (T, Q); //Bổ sung nút gốc vào Q
ng
While ( Q <> ) do
o
du
om
thuật không đệ quy
.c
VD:
ng
• Thứ tự đưa vào hàng: 1 | 2 3 | 4 5 | 6 7 | 8 9 | 10 |
co
1
an
• Thứ tự thăm: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
th
ng
2 3
o
du
u
7
cu
4 5 6
8 9 10
om
• Thường chỉ thích hợp khi cài đặt các cây NP đặc biệt.
.c
• Đối với cây thông thường, ta phải bổ sung thêm các nút để nó trở thành
ng
đặc biệt (thành cây đầy đủ hoặc hoàn chỉnh). Do đó, làm cho việc cài
co
đặt phức tạp và tốn bộ nhớ, nên ít khi được sử dụng.
an
• Thường chỉ áp dụng khi hệ thống không cung cấp CTLT móc nối.
th
– Sử dụng CTLT móc nối: ng
• Đây là cách thường được dùng do tính linh hoạt của CTLT móc nối, rất
o
thích hợp để cài đặt các CTDL phi tuyến.
du
• Do đó, trong phần tiếp theo ta chỉ xét phương pháp cài đặt này.
u
cu
om
– Các phần tử (nút) của cấu trúc cây:
.c
• Dùng các nút của CTLT để lưu trữ các phần tử.
ng
– Các nhánh (quan hệ cha-con) giữa các cặp nút:
co
• Sử dụng con trỏ để biểu diễn các nhánh.
an
th
• Do mỗi nút có nhiều nhất hai con nên trong mỗi nút của CTLT ta sẽ có
hai con trỏ để trỏ đến tối đa hai con này.
o ng
du
u
cu
om
• Trường Info: chứa thông tin về một phần tử.
.c
• Trường LP và RP tương ứng là hai con trỏ sẽ trỏ vào hai nút con trái và
ng
con phải.
co
• Nếu không có con thì giá trị con trỏ tương ứng sẽ rỗng (NIL/NULL)
an
• Khai báo cấu trúc một nút:
th
ng
struct Node { LP Info RP
o
type Info;
du
};
cu
om
• Ít nhất một con trỏ T trỏ vào nút gốc, vừa đại diện cho cây, vừa
.c
là điểm truy nhập vào các nút khác trong cây. T
ng
• Các thao tác muốn truy nhập vào các nút
1
co
trong cây phải thông qua con trỏ này.
• Nhận xét: với cách tổ chức này, khi kích
an
thước cây là N thì sẽ có N+1 con trỏ rỗng. 2 3
th
• Khai báo cấu trúc cây: có 2 cách,
ng
sau này để đơn giản ta sẽ dùng cách 1 4 5 6
o
du
om
.c
void InitBT (BinaryTree T) {
T
T = NULL;
ng
} 1
co
an
2 3
th
ng
4 5 6
o
du
u
cu
om
.c
{Duyệt cây theo thứ tự trước}
void PreOrderTraversal (BinaryTree T) {
ng
if (T==NULL) return;
co
Visit(T);
an
PreOrderTraversal(T->LP);
th
PreOrderTraversal(T->RP);
}
ng
T
o
du
1
u
cu
1, 2, 4, 5, 3, 6 2 3
4 5 6
om
.c
{Duyệt cây theo thứ tự giữa}
void InOrderTraversal (BinaryTree T) {
ng
if (T==NULL) return;
co
InOrderTraversal(T->LP);
an
Visit(T);
th
InOrderTraversal(T->RP);
}
ng
T
o
du
1
u
cu
4, 2, 5, 1, 6, 3 2 3
4 5 6
om
.c
{Duyệt cây theo thứ tự sau}
void PostOrderTraversal (BinaryTree T) {
ng
if (T==NULL) return;
co
PostOrderTraversal(T->LP);
an
PostOrderTraversal(T->RP);
th
Visit(T);
}
ng
T
o
du
1
u
cu
4, 5, 2, 6, 3, 1 2 3
4 5 6
om
– Mục đích: ứng dụng vào lưu trữ và tìm kiếm thông tin một các
hiệu quả nhất
.c
– Nguyên tắc: lưu trữ và tìm kiếm thông qua "khoá"
ng
co
• Nhóm thuộc tính khoá: bao gồm các thuộc tính, tính chất giúp chúng ta
hoàn toàn xác định được đối tượng
an
th
o ng
du
u
cu
om
– Khóa của gốc nhỏ hơn khoá của các đỉnh thuộc cây con phải
.c
– Cây con trái và cây con phải cũng là cây nhị phân tìm kiếm
ng
co
an
root
th
BSearchTree = BinaryTree; and ng
Key(LChild) < Key(root); and
Key(root) < Key(RChild); LChild RChild
o
du
AND
u
cu
om
struct Node {
.c
keytype Key; //Thường là kiểu có thứ tự, có thể so sánh được
ng
Node * LP, *RP;
};
co
an
typedef Node* PNode;
th
typedef PNode BinaryTree; ng
typedef BinaryTree BSearchTree;
o
du
u
cu
om
T T
.c
1 4
ng
co
2 3 2 6
an
th
4 5 6
ng 1 3 5
o
Cây nhị phân Cây nhị phân tìm kiếm
du
u
cu
om
trả về con trỏ NULL
.c
ng
PNode SearchT (BSearchTree Root, keytype x){
co
if (Root==NULL) return NULL;
an
if (x == Root->Key) return Root;
else if (x < Root->Key) return SearchT (Root->LP, x);
th
else return SearchT (Root->RP, x);
ng
}
o
du
u
cu
om
.c
T
ng
co
T 4 RP
LP
x <>4 ?
an
4
th
ng 2 6
2 6
o
du
1 3 5
u
cu
LT
RT
om
void InsertT (BSearchTree & Root, keytype x){
.c
PNode Q;
if (Root==NULL) { //khi cây rỗng
ng
Q = new Node; //tạo ra đỉnh mới
co
Q->Key = x;
an
Q->LP =Q->RP = NULL;
th
Root = Q;
}
ng
else {
o
du
}
}
om
– Tìm đến nút có giá trị khóa cần loại bỏ
.c
– Thực hiện phép loại bỏ nút đó
ng
– Thực hiện xắp xếp lại để đảm bảo tính chất cây tìm kiếm NP
co
• Nếu đỉnh cần loại bỏ là lá => không cần làm gì
an
• Nếu đỉnh cần loại bỏ chỉ có 1 cây con => thực hiện phép nối
th
• Nếu đỉnh cần loại bỏ có hai cây con LTree, RTree => cần thay khoá của
đỉnh hai cây con này bằng giá trị Max(LTree) hoặc Min(RTree)
ng
– Lưu ý:
o
du
• Giá trị Max(LTree) cần tìm ở phần tử bên phải ngoài cùng của cây con
Ltree: luôn đi theo bên phải của cây đến khi không được nữa
u
cu
om
Xóa nút lá Xóa nút chỉ có 1 cây con
.c
Xóa nút có 2 cây con
4 4 4
ng
co
x=9
an
2 9 2 9 2 or 9
th
ng
8 11 8 11 8 11 or
o
du
x=8
u
cu
6 10 6 10 6 10
x=10
5 7 5 7 5 7
om
void DeleteT (BSearchTree & Root, keytype x){
if (Root != NULL) {
.c
if (x < Root->Key) DeleteT (Root->LP, x);
ng
else if (x > Root->key) DeleteT (Root->RP, x);
else DelNode (Root); //Xoá gốc của cây
co
}
an
}
th
ng
void DelNode (PNode & P) { //Xóa giá trị ở nút P & sắp lại cây
o
PNode Q, R;
du
Q = P;
cu
P = P->RP;
} else if (P->RP = NULL) //Xóa nút chỉ có cây con trái
{
om
P = P->LP;
} else { //Xóa nút có 2 cây con
.c
[Tìm giá trị Max ở
Q = P->LP;
ng
if (Q->RP == NULL) {
cây con trái. Nó luôn
co
P->Key = Q->Key;
là giá trị ở nút ngoài
P->LP = Q->LP;
cùng bên phải cây
an
} else {
con => giải thuật:
th
do { //Dùng R để lưu parent của Q
Luôn đi theo bên R = Q;
ng
phải của Q, khi nào Q = Q->RP;
o
không đi đươc nữa } while (Q->RP != NULL);
du
Q->RP = NULL thì P->Key = Q->Key; //Lấy giá trị ở Q đưa lên
u
đó là nút ngoài cùng R->RP = Q->LP; //Chuyển con của Q lên vị trí Q
cu
bên phải] }
}
delete Q; //Xoá Q
}
Bộ Môn ĐT-KTMT - Viện ĐT-VT. Chương 11: Cấu trúc cây 46
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Cây tổng quát
• Giới thiệu
– Cây tổng quát là cây mà mỗi nút có thể có nhiều hơn hai con.
om
Nói chung, cây càng có nhiều con thì việc cài đặt càng phức
.c
tạp, nhất là những cây mà số con tối đa thường không cố định
ng
(VD: cây gia phả, cây thư mục).
co
4
an
C Users
th
ng
Windows
o
du
Program Files
cu
om
– Cài đặt gián tiếp qua cây nhị phân
.c
ng
co
an
th
o ng
du
u
cu
om
– Tương tự khi cài đặt cây NP
.c
– Chỉ thích hợp khi ta biết trước cấp của cây (số con tối đa của
ng
một nút) và thường là số cấp không lớn (4-5).
co
– Khi số cấp của cây lớn thì cách cài đặt này sẽ không hiệu quả
an
do tốn khá nhiều bộ nhớ để lưu các con trỏ rỗng.
th
ng
– Nguyên tắc cài đặt cụ thể: nếu gọi cấp của cây là d, thì cấu tạo
o
một nút gồm 2 phần:
du
• Phần móc nối sẽ có d con trỏ p1, p2,…pd để trỏ đến tối đa d con của nút.
cu
om
• Vẫn có một con trỏ T trỏ vào nút gốc của cây.
.c
• N là kích thước của cây => số con trỏ rỗng trong cây T là: N(d-1) + 1.
ng
• Khi d càng lớn thì số con trỏ rỗng trong cây sẽ càng nhiều, lớn hơn số
co
nút của cây nhiều lần => lãng phí bộ nhớ rất lớn.
an
• Hơn nữa, cách cài đặt này đòi hỏi chúng ta phải biết trước số con lớn
th
nhất có trong một nút của cây. Điều này không phải lúc nào cũng có
được trong các cây trong thực tế.
o ng
du
u
cu
om
– Tận dụng các kết quả cài đặt từ cây NP, đồng thời khắc phục
.c
các hạn chế của cách cài đặt trực tiếp.
ng
– Chuyển cây tổng quát về cây NP.
co
– Cài đặt gián tiếp thông qua cài đặt cây NP. Muốn như vậy, ta
an
phải xác định một quy tắc chuyển đổi hai chiều kiểu song ánh
th
từ cây tổng quát sang cây NP và ngược lại.
o ng
– Quy tắc:
du
• Coi cây tổng quát là cây có thứ tự. Nếu cây tổng quát không có thứ tự
u
• Chuyển nút con trái nhất (con cả) của một nút thành nút con trái của nó
• Chuyển nút em kế cận của một nút thành nút con phải của nút đó.
om
1 1
.c
ng
co
2 3 4 2
an
th
o ng
5 6 8 9 5 3
du
u
6 4
cu
om
– Cách cài đặt này cho phép ta cài đặt một cây bất kì, có thể có
.c
cấp rất lớn và rất hiệu quả về bộ nhớ.
ng
– Cần thêm quá trình chuyển đổi ngữ nghĩa thuận và nghịch giữa
co
cây tổng quát và cây nhị phân. Ví như bổ sung một nút là con
an
cả của một nút trong cây tổng quát sẽ thành bổ sung một nút
th
thành nút con trái trong cây NP => giảm tốc độ thực hiện các
ng
thao tác cơ bản như bổ sung, tìm kiếm trên cây.
o
du
u
cu
om
thông tin một các hiệu quả nhất (tốn ít bộ nhớ và thời gian chạy
.c
nhanh nhất)
ng
– Cây biểu thức: giúp ta thực hiện hàng loạt các thao tác tính
co
toán cơ bản cũng như phức tạp (do người dùng định nghĩa)
an
– Cây cân bằng
th
ng
• Một số ứng dụng khác
o
du
om
• Biểu thức = Biểu thức <Phép toán> Biểu thức
.c
• Đặc biệt: Biểu thức = const a b
ng
• Phép toán: +, / , *, -, exp, !, ...
co
! exp
– Dùng cây nhị phân
an
• Gốc: phép toán
th
• Lá: toán hạng n
ng
x
– Nhận xét: *
o
du
a +
• Duyệt cây theo Inorder => biểu thức infix
– Ví dụ: a+b, n!, exp(x), a*(d+b)
d b
Bộ Môn ĐT-KTMT - Viện ĐT-VT. Chương 11: Cấu trúc cây 55
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Ứng dụng cấu trúc cây NP
• Cây hỗ trợ ra quyết định (Ví dụ minh họa)
– VD: Có 5 đồng tiền vàng. Trong đó có duy nhất 1 đồng bị nhẹ
om
hơn. Tìm đồng tiền đó?
.c
(A+B) ? (C+D)
ng
co
The bad is in (A,B) < > The bad is in (C,D)
an
th
A? B
ng = C?D
o
du
om
– InitBTree(): Khởi tạo một cây rỗng
.c
– InsertParent (type x, PNode P): bổ sung phần tử x trở thành nút cha của nút P trong
ng
cây
– InsertLeftChild(type x, PNode P): bổ sung phần tử x trở thành nút con trái của nút
co
P trong cây
an
– InsertRightChild(type x, PNode P): bổ sung phần tử x trở thành nút con phải của
th
nút P trong cây ng
– PNode FindNode(type x): tìm một nút có giá trị bằng x trong cây, hàm trả về con
trỏ trỏ vào nút tìm thấy, trái lại trả về NULL
o
du
om
trong đó một Folder có thể chứa nhiều File và
.c
SubFolder. Yêu cầu định nghĩa class Folder và cài đặt
ng
các thao tác cơ bản:
co
– Init(): tạo ra một thư mục rỗng
an
– PNode GetCurrentFolder(): trả về con trỏ trỏ vào thư mục
hiện tại
th
ng
– Insert(Folder sub): bổ sung Folder sub thành con của thư mục
o
du
hiện tại
u
– Insert(File f): bổ sung File f thành con trong thư mục hiện tại
cu
– PNode Find(string fname) : tìm tên file hoặc thư mục có tên
fname cho trước. Hàm trả về con trỏ trỏ vào nút tìm được
om
trong chứa các phép toán +,-,*,/; còn các nút lá chứa các
.c
toán hạng là các hằng số hoặc biến số. Yêu cầu định
ng
nghĩa class Expression để biểu diễn cho cây trên, đồng
co
thời cài đặt các hàm sau:
an
– Init(): khởi tạo một biểu thức rỗng
th
– Init(string exp): khởi tạo một cây biểu thức từ chuỗi biểu thức
ng
exp
o
du
om
.c
ng
co
an
th
o ng
du
u
cu