tài liệu uy tín được biên soạn bởi giảng viên đại học Bách Khoa TPHCM, thuận lợi cho qua trình tự học, nghiên cứu bộ tự động hóa, điện tử, cơ điện tử, cơ khí chế tạo máy, lập trình nhúng, Tài liệu được kiểm duyệt bởi giảng viên, phòng đào tạo trường đại học bách khoa, lưu hành nội bộ
Trang 1Chương 6
Cây nhị phân và cây BST
(Buổi 10, 11)
Trang 2Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
Trang 3Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
Cây (tree) là một tập hợp T rỗng hoặc bao gồm
nhiều phần tử, mỗi phần tử được gọi là nút
(node), trong đó:
f Một nút được gọi là nút gốc (root).
f Các nút còn lại được chia thành m nhóm, mỗi
nhóm là một cây và được gọi là cây con (subtree).
Cây rỗng (null tree) là một cây không có nút
nào.
Định nghĩa cây
Trang 4Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
Trang 5Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
Mức 3
Mức 4
Trang 6Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
Bậc (degree) của nút và bậc của cây
f Bậc của nút là số cây con của nút này Một nút
không có cây con thì có bậc là 0.
y Ví dụ: Các nút A, B có bậc là 2.
f Bậc của cây là bậc lớn nhất của các nút của cây
này. Cây nhị phân (binary tree) là cây bậc 2.
y Ví dụ: Cây trong Hình 5.2 có bậc là 3.
Các thuật ngữ
Trang 7Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
Trang 8Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
f Chiều cao của cây là mức lớn nhất của các nút lá.
y Ví dụ: Cây trong Hình 5.2 có chiều cao là 4.
Các thuật ngữ
Trang 9Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
f Nút y là nút trước của nút x nếu cây con gốc y có
chứa nút x; khi đó, nút x được gọi là nút sau của
nút y.
y Ví dụ: Nút B là nút trước của nút G, nút G là nút sau
của nút B.
Nút cha (parent), nút con (child) và nút anh em
f Nếu nút y là nút trước của nút x và mức của nút x
bằng mức của nút y cộng 1 thì nút y được gọi là
nút cha của nút x và nút x được gọi là nút con của
nút y.
y Ví dụ: Nút B là nút cha của nút E và nút E là nút con
của nút B.
Các thuật ngữ
Trang 10Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
Cây có thứ tự (ordered tree) là một cây nếu ta
hoán vị các cây con của nó thì ta sẽ có một cây mới.
Các thuật ngữ
Trang 11Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
f Info : chứa thông tin của nút.
f Left : chứa tham chiếu đến nút con bên trái.
f Right : chứa tham chiếu đến nút con bên phải.
Trang 12Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
Trang 13Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
// Kiểm tra cây root rỗng
bool IsEmpty(ref root)
Trang 14Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
Duyệt cây là quá trình đi qua tất cả các nút của
cây mà mỗi nút chỉ được xử lý một lần.
f N là nút gốc của cây con.
f L là cây con bên trái.
f R là cây con bên phải
N
Biểu diễn cây nhị phân
Trang 15Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
Các loại duyệt cây:
f Duyệt cây theo chiều sâu (DFS – Depth-First
Search).
y Thứ tự tiền tố (pre-order): N LR, N RL.
y Thứ tự trung tố (in-order): L N R, R N L.
y Thứ tự hậu tố (post-order): LR N , RL N
f Duyệt cây theo chiều rộng (BFS – Breadth-First
Search): duyệt cây theo mức.
Trang 16Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
Trang 17Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
// Duyệt cây root theo thứ tự NLR
void NLR(ref root)
{
if (IsEmpty(root))
cout << "Cay rong" << endl;
else {
cout << "Cay nhi phan:" << endl;
TraversalNLR(root, 1);
} }
Trang 18Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
cout << p->Info << endl;
TraversalNLR(p->Left, n+2);
TraversalNLR(p->Right, n+2);
} else
cout << "0" << endl;
}
Trang 19Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
Trang 20Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
// Duyệt cây root theo thứ tự LNR
void LNR(ref root)
{
if (IsEmpty(root))
cout << "Cay rong" << endl;
else {
cout << "Cay nhi phan:" << endl;
TraversalLNR(root, 1);
} }
Trang 21Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
for (int i = 1; i <= n; i++)
cout << " ";
cout << "0" << endl;
} }
Trang 22Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
Trang 23Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
// Duyệt cây root theo thứ tự LRN
void LRN(ref root)
{
if (IsEmpty(root))
cout << "Cay rong" << endl;
else {
cout << "Cay nhi phan:" << endl;
TraversalLRN(root, 1);
} }
Trang 24Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
for (int i = 1; i <= n; i++)
cout << " ";
cout << "0" << endl;
} }
Trang 25Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
// Tạo cây từ mảng a theo thứ tự duyệt NLR
ref CreateTree(int a[])
Trang 26Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
// Tạo cây từ mảng a[]
ref CreateTreeNLR(int a[], int& i)
}
Trang 27Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
Trang 28Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
Chiều cao của cây
// Chiều cao của cây p
int hl = Height(p->Left); int hr = Height(p->Right);
Trang 29Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
// Số nút lá của cây root
int Leaves(ref root)
Trang 30Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
Trang 31Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
Số nút trung gian của cây
// Số nút trung gian của cây root
int Interiors(ref root)
Trang 32Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
Số nút trung gian của cây
// Số nút trung gian của cây p
Trang 33Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
Cây nhị phân tìm kiếm (BST – Binary Search
Tree) là một cây nhị phân mà tại mỗi nút p của cây thì:
f Khóa của nút p lớn hơn các khóa của các nút của
cây con bên trái
f khóa của nút p nhỏ hơn các khóa của các nút của
cây con bên phải
K p – khóa của nút p
K L – khóa của một nút bất kỳ của cây con bên trái
K R – khóa của một nút bất kỳ của cây con bên phải
K L < K p < K R
Trang 34Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
Trang 35Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
Trang 36Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
f Key : chứa khóa (và thông tin) của nút.
f Count : số lần xuất hiện khóa của nút.
f Left : chứa tham chiếu đến nút con bên trái.
f Right : chứa tham chiếu đến nút con bên phải.
Trang 37Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
Trang 38Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
Kiểm tra cây BST rỗng
Thêm một nút mới vào cây BST.
Tìm kiếm một nút của cây BST.
Loại bỏ một nút của cây BST.
Trang 39Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
// Kiểm tra cây root rỗng
bool IsEmpty(ref root)
{
bool kq = root == NULL;
return kq;
}
Trang 40Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
// Thêm khóa x vào cây p
void InsertTree(ref& p, int x)
{
if (p == NULL) {
p = new Node; // Tạo nút mới p p->Key = x;
p->Count = 1;
p->Left = NULL;
p->Right = NULL;
} else
Trang 41Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
// Tìm kiếm khóa x trong cây p
// Trả về địa chỉ của nút tìm thấy.
ref Find(ref p, int x)
Trang 42Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
// Tìm và loại bỏ khóa x trong cây p
void Remove(ref& p, int x)
{
if (p != NULL) {
p = p->Left; // p chỉ có cây con bên trái else if ((p->Left == NULL) && (p->Right != NULL))
p = p->Right; // p chỉ có cây con bên phải
Trang 43Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
else // p có hai cây con
Del(p->Left, q); // Nút cực phải của cây con bên trái delete q;
} }
}
// Tìm nút cực phải của cây con bên trái của r
void Del(ref& r, ref& q)