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)

 

ppt 62 trang kimcuc 5180
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

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:

  • pptbai_giang_ngon_ngu_lap_trinh_chuong_4_cay_pham_thanh_an.ppt