Bài giảng Ngôn ngữ lập trình - Chương 4: Cây - Phạm Thanh An
Khái niệm về cây (tree)
Là tập hữu hạn các nút (tree node), sao cho
Có một nút gọi là nút gốc (root)
Các nút còn lại được phân hoạch thành n tập riêng biệt T1, T2 , . , Tn, mỗi tập Ti là một cây
Giữa các nút có quan hệ phân cấp (hierarchical relationship) gọi là “quan hệ cha con”
Cây không có nút gọi là cây rỗng (null tree)
Biểu diễn cây
Bằng đồ thị
Bằng giản đồ
Bằng danh sách (các dấu ngoặc lồng nhau)
Bằng phương pháp Indentatio
Các thuật ngữ
Bậc của nút và bậc của cây
Nút A: bậc 3, nút C bậc 1
Bậc của cây: 3
Nút gốc, Nút lá và nút nhánh
Nút cha (Parent), nút con (children)
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Ngôn ngữ lập trình - Chương 4: Cây - Phạm Thanh An", để tải tài liệu gốc về máy hãy click vào nút Download ở trên
Tóm tắt nội dung tài liệu: Bài giảng Ngôn ngữ lập trình - Chương 4: Cây - Phạm Thanh An
Ths. Phạm Thanh An
Bộ môn Khoa học máy tính - Khoa CNTT
Trường Đại học Ngân hàng TP.HCM
Chương 4: Cây
Mục tiêu
Trang bị cho sinh viên các khái niệm và ứng dụng cây
Cài đặt và thực hiện các phép toán trên cây, đặc biệt là các phép toán trên cây nhị phân nhị phân tìm kiếm.
Nội dung
Định nghĩa và các khái niệm
Cây nhị phân
Cây nhị phân tìm kiếm (BST)
Cây tổng quát
Cây (trong máy tính)
Nhánh
Lá
Gốc
Nút
Khái niệm về cây (tree)
Là tập hữu hạn các nút (tree node), sao cho
Có một nút gọi là nút gốc (root)
Các nút còn lại được phân hoạch thành n tập riêng biệt T1, T2 , ... , Tn, mỗi tập Ti là một cây
Giữa các nút có quan hệ phân cấp (hierarchical relationship) gọi là “quan hệ cha con”
Cây không có nút gọi là cây rỗng (null tree)
Biểu diễn cây
Bằng đồ thị
Bằng giản đồ
Bằng danh sách (các dấu ngoặc lồng nhau)
Bằng phương pháp Indentatio
Biểu diễn cây
Bằng đồ thị
/
A
D
C
F
B
G
E
I
H
J
Cây con
A
B
D
C
G
H
E
F
I
J
K
Biểu diễn cây
Bằng giản đồ
A
B
C
F
D
G
J
E
H
I
Biểu diễn cây
Bằng danh sách (các dấu ngoặc lồng nhau)
(/( A (C (F), D (G ( J ) ) ) ), (B (E ( H, I ) ) ) )
( A ( B ( E ( K, L ), F ), C ( G ), D ( H ( M ), I, J ) ) )
/
A
D
C
F
B
G
E
I
H
J
Biểu diễn cây
Bằng phương pháp Indentatio
A
C
F
D
G
J
B
E
H
I
/
A
D
C
F
B
G
E
I
H
J
Các thuật ngữ
Bậc của nút và bậc của cây
Nút A: bậc 3, nút C bậc 1
Bậc của cây: 3
Nút gốc, Nút lá và nút nhánh
Nút cha (Parent), nút con (children)
Các thuật ngữ
Đường đi (path)
/
A
D
C
F
B
G
E
I
H
J
A
D
G
J
Các thuật ngữ
Mức của nút và chiều cao của cây
1
2
3
4
5
Root
Chiều cao của cây: 5
Các thuật ngữ
Tổ tiên ( ancestors) của một nút
Tổ tiên của nút J
Con cháu (Descendant) của một nút:
Con cháu của B
Các con của cùng một cha gọi là anh em ruột ( siblings)
/
A
D
C
F
B
G
E
I
H
J
Cây có thứ tự và Rừng
Cây có thứ tự (ordered tree)
Một cây gọi là có thứ tự khi ta thay đổi vị trí của các cây con, ta nhận được một cây mới
Rừng (forest)
Tập hợp hữu hạn các cây phân biệt
Nếu bỏ đi nút gốc của một cây, ta sẽ thu được một rừng gồm nhiều cây phân biệt
Cây nhị phân
Định nghĩa
Cây con trái
Cây con phải
Cây nhị phân
Cây nhị phân biểu diễn biểu thức toán học
Tính chất của cây nhị phân
Số nút tối đa mức i trong cây 2 i-1
Số nút tối đa trong cây là 2 h -1 (h chiều cao của cây)
1
2
3
4
5
Chiều cao của cây h log 2 N (N là số nút trong cây).
Cây nhị phân hoàn chỉnh
/
A
D
C
B
G
E
I
G
J
Các nút ứng với các mức trừ mức cuối đều đạt tối đa,
ở mức cuối, các nút đều đạt về phía trái
Cây nhị phân đầy đủ
/
A
D
C
B
E
I
Các nút đạt tối đa ở cả mọi mức
Cây nhị phân gần đầy
/
A
D
C
B
G
E
I
G
J
Các nút ứng với các mức trừ mức cuối đều đạt tối đa,
ở mức cuối, các nút không dạt đều về phía trái
Tổ chức lưu trữ cây nhị phân
Sử dụng mảng một chiều (lưu trữ kế tiếp)
Đánh số thứ tự từ gốc, tại mỗi mức, đánh số các nút từ trái sang phải, từ mức thấp đến mức cao
Sử dụng liên kết(Lưu trữ liên kết)
Quản lý cây thông qua nút gốc (root)
Mỗi nút cấp phát động, bao gồm dữ liệu và hai liên kết pLeft, pRight, liên kết tới cây con trái và cây con phải
Nút lá có hai liên kết trái phải đều rỗng
Lưu trữ kế tiếp cây nhị phân
Con của nút thứ i là nút thứ 2i + 1và 2i+2
Cha của nút thứ j là nút [(j-1)/2]
R
A
D
C
B
E
I
0
1
2
3
4
5
6
R
A
E
D
I
B
C
V[0]
V[1]
V[6]
V[4]
V[5]
V[2]
V[3]
Sử dụng Liên kết
R
A
B
C
D
E
G
G
Root
Sử dụng Liên kết
Cấu tạo của nút
Tạo lập bằng cách cấp phát bộ nhớ động
Mỗi nút gồm có các thông tin:
Dữ liệu (data)
2 liên kết pLeft, pRight liên kết đến nút con trái và nút con phải
Cấu trúc của nút
Class Node {
int Data;
Node pLeft; // liên kết đến nút con trái
Node pRight; // liên kết đến nút con phải
};
Node root = NULL; // gốc của cây
Data
pLeft
pRight
Data
pLeft
pRight
Phép duyệt cây nhị phân
Định nghĩa
là phép xử lý các nút trên cây, mỗi nút một lần
Duyệt cây theo thứ tự trước (preorder)
Duyệt cây theo thứ tự giữa (inorder)
Duyệt cây theo thứ tự sau (postorder)
Duyệt cây theo thứ tự trước
Duyệt cây theo thứ tự trước (NLR)- Đệ qui
Thăm gốc
Duyệt cây con trái theo thứ tự trước
Duyệt cây con phải theo thứ tự trước
R
A
D
C
F
B
G
E
I
H
J
R
A
C
F
D
G
J
B
E
H
I
R
A
C
F
D
G
J
B
E
H
I
Duyệt theo thứ tự trước
void preorder(Node root)
{
if (root != NULL) {
- In ra : root.data;
preorder(root.pLeft);
predorder(root.pRight);
}
}
Duyệt cây theo thứ tự giữa
Duyệt cây theo thứ tự giữa (LNR)
Duyệt cây con trái theo thứ tự giữa
Thăm gốc
Duyệt cây con phải theo thứ tự giữa
R
A
D
C
F
B
G
E
I
H
J
R
A
C
F
D
G
J
B
E
H
I
F
C
A
G
J
D
R
B
H
E
I
Duyệt cây theo thứ tự giữa
void inorder(Node root)
{
if (root != NULL) {
inorder(root.pLeft);
In ra: root.data;
indorder(root.pRight);
}
}
Duyệt cây theo thứ tự sau
Duyệt cây theo thứ tự sau (LRN)
Duyệt cây con trái theo thứ tự sau
Duyệt cây con phải theo thứ tự sau
Thăm gốc
R
A
D
C
F
B
G
E
I
H
J
R
A
C
F
D
G
J
B
E
H
I
F
C
J
G
D
A
H
I
E
B
R
Duyệt cây theo thứ tự sau
void postorder(Node root)
{
if (root !=null) {
postorder(root.pleft);
postdorder(root.pright);
In ra: root.data;
}
}
Cây nhị phân tìm kiếm
Định nghĩa: (Binary Search Tree – BST)
44
18
88
13
37
59
108
15
23
40
55
71
Cây nhị phân tìm kiếm
Khai báo cây
Class BSTNode {
int Data;
BSTNode pLeft; //con trỏ đến nút con trái
BSTNode pRight; //con trỏ đến nút con phải
};
BSTNode root = NULL; // gốc của cây
Cây nhị phân tìm kiếm
Các thao tác trên cây BST
Tìm nút có khóa x
Xóa một nút có khóa là x
Tìm nút có khóa nhỏ nhất
Tìm nút có khóa lớn nhất
Giải phóng cây
Cây nhị phân tìm kiếm
int Insert( int X, BSTNode root);
int Delete( int X, BSTNode root);
BST_Node Find( int X, BSTNode root);
BST_Node FindMin( BSTNode root);
BST_Node FindMax(BSTNode root);
void MakeEmpty( BSTNode root);
Thêm một phần tửvào cây nhị phân tìm kiếm
Thêm vào phần tử có khóa x
44
18
88
13
37
59
108
15
23
40
55
71
Thêm X= 50
X > 44
X < 88
X < 59
50
X < 55
root
Thêm một phần tửvào cây nhị phân tìm kiếm
int Insert(int X, BST_Node root)
{ if (root == NULL)
{ root =new BSTreeNode ;
if ( root == NULL )
return -1; // Không thể cấp phát bộ nhớ
else
{
root.Data = X;
root. pL eft = root. pR ight = NULL;
return 1; // Thêm vào thành công
}
}
Thêm một phần tửvào cây nhị phân tìm kiếm
else
if (root.Data ==X)
return 0 ; // Đã tồn tại trong cây
else
if ( X< root.Data )
return Insert( X, root.pLeft );
else
return Insert( X, root.pRight );
}
Tìm một nút có khóa X
Tìm nút có khóa X
44
18
88
13
37
59
108
15
23
40
55
71
Tìm X=55
X >44
X < 88
X < 59
root
Tìm một nút có khóa X
BSTNode Find( int X, BSTNode root)
{ if( root == NULL )
return NULL;
if ( X < root.data)
return Find( X, root.pLeft );
else if ( X > root.data)
return Find( X, root.pRight );
else
return root;
}
Tìm một nút có khóa X
Tìm nút có khóa X, không dùng đệ qui
BTSNode Find2(int X, BTSNode root)
{
BTSNode p = root;
while (p != NULL)
{
if(X == p.data) return p;
else
if(x < p.data) p = p.pLeft;
else
p = p.pRight;
}
return NULL;
}
Tìm nút có khóa nhỏ nhất
BSTNode FindMin( BSTNode root)
{ if ( root == NULL )
return NULL;
else if( root.pLeft == NULL )
return root;
else
return FindMin( root.pLeft );
}
Tìm nút có khóa lớn nhất
BST_Node FindMax(BSTNode root)
{
if (root != NULL )
while (root.pRight != NULL )
root = root.pRight;
return root;
}
Xóa một nút có khóa X trên cây BST
Xóa một nút có khóa X trên cây BST, có ba trường hợp:
Nút có khóa X là nút lá.
Nút có khóa X chỉ có 1 con (trái hoặc phải).
Nút có khóa X có đủ cả 2 con
Xóa một nút có khóa X
Trường hợp 1 :Nút có khóa X trên cây BST là nút lá:
44
18
88
13
37
59
108
15
23
40
55
71
Xóa: X=40
root
Đơn giản : Xóa nút X, vì nó không móc nối đến nút nào khác
Xóa một nút có khóa X trên cây BST
Trường hợp 2 : Nút X có một cây con trái hoặc phải
root
44
18
88
13
37
59
108
15
23
55
71
Xóa X=37
44
18
88
13
37
59
108
15
40
55
71
Xóa X=37
root
Xóa một nút có khóa X trên cây BST
Trường hợp 3 : Nút X có một cây hai con trái và phải
Hủy gián tiếp
15
44
18
88
13
37
59
108
15
23
40
55
71
Xóa nút X=18
30
root
Cây nhị phân tìm kiếm(Binary Search Tree – BST)
int Delete( int X, BSTNode root)
{ BSTNode p;
if ( root == NULL )
return 0 ; // cây rỗng, không tim thấy
else
if ( X < root.Data) // xóa trên cây con trái
return Delete( X, root.pLeft );
else
if ( X > root.Data ) // xóa trên cây con phải
retrurn Delete( X, root.pRight );
else // tìm ra nút cần xóa
Cây nhị phân tìm kiếm(Binary Search Tree – BST)
if ( root.pLeft && root.pRight ) // Có hai con
{ p = FindMax(root.pLeft); // tìm nút có khóa lớn nhất trên con trái
root.Data = p.Data;
return Delete(root.Data, root.pLeft);
}
else // có một con hoặc không có con
{ p = root;
if ( root.pLeft == NULL ) // xử lý như không có con
root = root.pRight;
else if ( root.pRight == NULL )
root = root.pLeft;
p = null;
}
return 1;
}
Giải phóng cây BST
void MakeEmpty( BST_Node root);
{
if (root)
{
MakeEmpty(root.pLeft);
MakeEmpty(root.pRight);
delete root ;
}
}
Cây nhị phân liên kết vòng
Định nghĩa
Sử dụng liên kết NULL để lưu trữ liên kết tới nút kế tiếp trong phép duyệt cây nhị phân -> phép duyệt được thực hiện dễ dàng
Sử dụng giá trị kiểm tra liên kết thật (đến nút trong cây) hay liên kết giả (nút trong phép duyệt)
Ltype = true, nếu liên kết trái là liên kết thật
Rtype = true, nếu liên kết phải là liên kết thật
LPTR
LTYPE
INFO
RTYPE
RPTR
Cây nhị phân liên kết vòng
Cây nhị phân liên kết vòng (NLR)
R
A
D
B
E
R
A
D
B
E
R
A
D
B
E
R
A
B
D
E
1
R
1
0
A
1
0
B
1
0
D
0
0
E
0
Cây tổng quát
Định nghĩa
Cây m phân là cây mà mỗi nút có tối đa m nút con (cây con)
Biểu diễn cây m phân bằng liên kết động
Mỗi nút có m+1 trường, với m mối nối
Với cây m phân đầy đủ, có n(m-1)+1 mối liên kết NULL
Cây tổng quát
Biểu diễn cây tổng quát
Biểu diễn cây tổng quát bằng cây nhị phân
Đối với một nút trên cây tổng quát
Một nút con nằm ở vị trí trái nhất (con cả 1)
Một nút kế cận với nút đang xét kể từ trái sang (em kế - 2)
Cây tổng quát
Biểu diễn cây tổng quát
R
A
D
C
B
H
E
G
I
J
R
A
D
C
B
H
E
G
I
J
R
A
C
D
H
I
B
J
G
E
class TreeNode
{int info;
TreeNode FirstChild; // con cả
TreeNode NextSibling; //em kê
};
Data
FirstChild
NextSibling
Cây tổng quát
Phép duyệt cây tổng quát NLR(T)
Nếu T rỗng, dừng
Ngược lại, T 1 ,,T n là cây con gốc T
Thăm gốc của T
NLR(T 1 ), T 1 cây con thứ nhất của gốc T
Duyệt cây con T 2 ,,T n của T theo thứ tự trước
Cây tổng quát
Phép duyệt cây tổng quát LNR(T)
Nếu T rỗng, dừng
Ngược lại, T 1 ,,T n là cây con gốc T
LNR(T 1 ), T 1 cây con thứ nhất của gốc T
Thăm gốc của T
Duyệt cây con T 2 ,,T n của T theo thứ tự giữa
Cây tổng quát
Phép duyệt cây tổng quát LRN(T)
Nếu T rỗng, dừng
Ngược lại, T 1 ,,T n là cây con gốc T
LNR(T 1 ), T 1 cây con thứ nhất của gốc T
Duyệt cây con T 2 ,,T n của T theo thứ tự giữa
Thăm gốc của T
Cây tổng quát
Duyệt cây theo mức
Duyệt cây theo chiều rộng
Ý tưởng
Tổ chức thành một hàng đợi
Đưa nút gốc vào hàng đợi
Lặp
Lấy một nút ra khỏi hàng đợi
Duyệt nút T
Đưa các nút con của T (nếu có) vào hàng đợi
Q&A
File đính kèm:
bai_giang_ngon_ngu_lap_trinh_chuong_4_cay_pham_thanh_an.ppt

