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ộ
Chương Cây nhị phân BST (Buổi 10, 11) Nội dung Trường Đại học Bách Khoa Tp.HCM Khoa Khoa học Kỹ thuật Máy tính © 2015 Nguyễn Trung Trực Cấu trúc liệu Giải thuật Chương Cây BST Định nghĩa Cây (tree) tập hợp T rỗng bao gồm nhiều phần tử, phần tử gọi nút (node), đó: Một nút gọi nút gốc (root) f Các nút lại chia thành m nhóm, nhóm gọi (subtree) f Cây rỗng (null tree) khơng có nút Trường Đại học Bách Khoa Tp.HCM Khoa Khoa học Kỹ thuật Máy tính © 2015 Nguyễn Trung Trực Cấu trúc liệu Giải thuật Chương Cây BST Định nghĩa * + - / a b d e c Cây biểu diễn biểu thức (a + b / c) * (d – e) dạng trung tố Trường Đại học Bách Khoa Tp.HCM Khoa Khoa học Kỹ thuật Máy tính © 2015 Nguyễn Trung Trực Cấu trúc liệu Giải thuật Chương Cây BST Định nghĩa Mức A B Mức Mức E D Mức C F G I J H Cây nhiều nhánh Trường Đại học Bách Khoa Tp.HCM Khoa Khoa học Kỹ thuật Máy tính © 2015 Nguyễn Trung Trực Cấu trúc liệu Giải thuật Chương Cây BST Các thuật ngữ Bậc (degree) nút bậc f Bậc nút số nút Một nút khơng có có bậc y f Ví dụ: Các nút A, B có bậc Bậc bậc lớn nút Cây nhị phân (binary tree) bậc y Ví dụ: Cây Hình 5.2 có bậc Trường Đại học Bách Khoa Tp.HCM Khoa Khoa học Kỹ thuật Máy tính © 2015 Nguyễn Trung Trực Cấu trúc liệu Giải thuật Chương Cây BST Các thuật ngữ Nút (leaf) nút trung gian (interior node) f Nút nút kết thúc nút có bậc (khơng có con) y f Ví dụ: Các nút D, F, G, H, I, J nút Nút trung gian nút có bậc khác khơng nút gốc y Ví dụ: Các nút B, E, C nút trung gian Nút A nút gốc Trường Đại học Bách Khoa Tp.HCM Khoa Khoa học Kỹ thuật Máy tính © 2015 Nguyễn Trung Trực Cấu trúc liệu Giải thuật Chương Cây BST Các thuật ngữ Mức (level) nút chiều cao (height) f Mức nút gốc Mức nút khác gốc mức nút gốc nhỏ chứa nút cộng y f Ví dụ: Mức nút A Mức nút D, E, I, J Chiều cao mức lớn nút y Ví dụ: Cây Hình 5.2 có chiều cao Trường Đại học Bách Khoa Tp.HCM Khoa Khoa học Kỹ thuật Máy tính © 2015 Nguyễn Trung Trực Cấu trúc liệu Giải thuật Chương Cây BST Các thuật ngữ Nút trước nút sau f Nút y nút trước nút x gốc y có chứa nút x; đó, nút x gọi nút sau nút y y Ví dụ: Nút B nút trước nút G, nút G nút sau nút B Nút cha (parent), nút (child) nút anh em f Nếu nút y nút trước nút x mức nút x mức nút y cộng nút y gọi nút cha nút x nút x gọi nút nút y y Ví dụ: Nút B nút cha nút E nút E nút nút B Trường Đại học Bách Khoa Tp.HCM Khoa Khoa học Kỹ thuật Máy tính © 2015 Nguyễn Trung Trực Cấu trúc liệu Giải thuật Chương Cây BST Các thuật ngữ f Hai nút gọi anh em chúng có nút cha y Ví dụ: Nút D E hai nút anh em có nút cha B Cây có thứ tự (ordered tree) ta hoán vị ta có Trường Đại học Bách Khoa Tp.HCM Khoa Khoa học Kỹ thuật Máy tính © 2015 Nguyễn Trung Trực Cấu trúc liệu Giải thuật Chương Cây BST 10 Số nút // Số nút root int Leaves(ref root) { int n = 0; if (root != NULL) if ((root->Left != NULL) || (root->Right != NULL)) n = TreeLeaves(root); return n; } int main() { int n = Leaves(root); return 0; } Trường Đại học Bách Khoa Tp.HCM Khoa Khoa học Kỹ thuật Máy tính © 2015 Nguyễn Trung Trực Cấu trúc liệu Giải thuật Chương Cây BST 29 Số nút // Số nút p int TreeLeaves(ref p) { int n; if (p == NULL) n = 0; else if ((p->Left == NULL) && (p->Right == NULL)) n = 1; else n = TreeLeaves(p->Left) + TreeLeaves(p->Right); return n; } Trường Đại học Bách Khoa Tp.HCM Khoa Khoa học Kỹ thuật Máy tính © 2015 Nguyễn Trung Trực Cấu trúc liệu Giải thuật Chương Cây BST 30 Số nút trung gian // Số nút trung gian root int Interiors(ref root) { int n = TreeInteriors(root); if (n > 0) n ; return n; } int main() { int n = Interiors(root); return 0; } Trường Đại học Bách Khoa Tp.HCM Khoa Khoa học Kỹ thuật Máy tính © 2015 Nguyễn Trung Trực Cấu trúc liệu Giải thuật Chương Cây BST 31 Số nút trung gian // Số nút trung gian p int TreeInteriors(ref p) { int n; if (p == NULL) n = 0; else if ((p->Left == NULL) && (p->Right == NULL)) n = 0; else n = TreeInteriors(p->Left) + TreeInteriors(p->Right) + 1; return n; } Trường Đại học Bách Khoa Tp.HCM Khoa Khoa học Kỹ thuật Máy tính © 2015 Nguyễn Trung Trực Cấu trúc liệu Giải thuật Chương Cây BST 32 Định nghĩa BST Cây nhị phân tìm kiếm (BST – Binary Search Tree) nhị phân mà nút p thì: Khóa nút p lớn khóa nút bên trái f khóa nút p nhỏ khóa nút bên phải Kp – khóa nút p KL – khóa nút bên trái KR – khóa nút bên phải KL < Kp < KR f Trường Đại học Bách Khoa Tp.HCM Khoa Khoa học Kỹ thuật Máy tính © 2015 Nguyễn Trung Trực Cấu trúc liệu Giải thuật Chương Cây BST 33 Định nghĩa BST 15 20 10 17 25 Cây nhị phân tìm kiếm (BST – Binary Search Tree) Trường Đại học Bách Khoa Tp.HCM Khoa Khoa học Kỹ thuật Máy tính © 2015 Nguyễn Trung Trực Cấu trúc liệu Giải thuật Chương Cây BST 34 Định nghĩa BST 15 20 18 17 25 Cây nhị phân không BST Trường Đại học Bách Khoa Tp.HCM Khoa Khoa học Kỹ thuật Máy tính © 2015 Nguyễn Trung Trực Cấu trúc liệu Giải thuật Chương Cây BST 35 Cấu trúc liệu Node: nút có bốn phần Key: chứa khóa (và thơng tin) nút f Count: số lần xuất khóa nút f Left: chứa tham chiếu đến nút bên trái f Right: chứa tham chiếu đến nút bên phải f Trường Đại học Bách Khoa Tp.HCM Khoa Khoa học Kỹ thuật Máy tính © 2015 Nguyễn Trung Trực Cấu trúc liệu Giải thuật Chương Cây BST 36 Cấu trúc liệu #include using namespace std; struct Node; typedef Node* ref; struct Node { int Key; int Count; ref Left; ref Right; }; int main() { ref root; return 0; } Trường Đại học Bách Khoa Tp.HCM Khoa Khoa học Kỹ thuật Máy tính © 2015 Nguyễn Trung Trực Cấu trúc liệu Giải thuật Chương Cây BST 37 Các tác vụ BST Tạo BST rỗng Kiểm tra BST rỗng Thêm nút vào BST Tìm kiếm nút BST Loại bỏ nút BST Trường Đại học Bách Khoa Tp.HCM Khoa Khoa học Kỹ thuật Máy tính © 2015 Nguyễn Trung Trực Cấu trúc liệu Giải thuật Chương Cây BST 38 Các tác vụ BST // Tạo rỗng void InitTree(ref& root) { root = NULL; } // Kiểm tra root rỗng bool IsEmpty(ref root) { bool kq = root == NULL; return kq; } Trường Đại học Bách Khoa Tp.HCM Khoa Khoa học Kỹ thuật Máy tính © 2015 Nguyễn Trung Trực Cấu trúc liệu Giải thuật Chương Cây BST 39 Các tác vụ BST // Thêm khóa x vào p void InsertTree(ref& p, int x) { if (p == NULL) { p = new Node; p->Key = x; p->Count = 1; p->Left = NULL; p->Right = NULL; } else if (x < p->Key) InsertTree(p->Left, x); else if (x > p->Key) InsertTree(p->Right, x); else p->Count = p->Count + 1; } Trường Đại học Bách Khoa Tp.HCM Khoa Khoa học Kỹ thuật Máy tính © 2015 // Tạo nút p // Tìm x bên trái // Tìm x bên phải // Tăng số lần xuất khóa x Nguyễn Trung Trực Cấu trúc liệu Giải thuật Chương Cây BST 40 Các tác vụ BST // Tìm kiếm khóa x p // Trả địa nút tìm thấy ref Find(ref p, int x) { ref q; if (p == NULL) q = NULL; else if (x == p->Key) q = p; else if (x < p->Key) q = Find(p->Left, x); else q = Find(p->Right, x); return q; } Trường Đại học Bách Khoa Tp.HCM Khoa Khoa học Kỹ thuật Máy tính © 2015 Nguyễn Trung Trực Cấu trúc liệu Giải thuật Chương Cây BST 41 Các tác vụ BST // Tìm loại bỏ khóa x p void Remove(ref& p, int x) { if (p != NULL) { if (x < p->Key) Remove(p->Left, x); // Tìm bỏ bên trái else if (x > p->Key) Remove(p->Right, x); // Tìm bỏ bên phải else // Tìm thấy x { ref q = p; if ((p->Left == NULL) && (p->Right == NULL)) p = NULL; // p nút else if ((p->Left != NULL) && (p->Right == NULL)) p = p->Left; // p có bên trái else if ((p->Left == NULL) && (p->Right != NULL)) p = p->Right; // p có bên phải Trường Đại học Bách Khoa Tp.HCM Khoa Khoa học Kỹ thuật Máy tính © 2015 Nguyễn Trung Trực Cấu trúc liệu Giải thuật Chương Cây BST 42 Các tác vụ BST else Del(p->Left, q); delete q; // p có hai // Nút cực phải bên trái } } } // Tìm nút cực phải bên trái r void Del(ref& r, ref& q) { if (r->Right != NULL) Del(r->Right, q); else // Chép nút cực phải r vào nút q { q->Key = r->Key; q->Count = r->Count; q = r; r = r->Left; } } Trường Đại học Bách Khoa Tp.HCM Khoa Khoa học Kỹ thuật Máy tính © 2015 Nguyễn Trung Trực Cấu trúc liệu Giải thuật Chương Cây BST 43 ... Cây BST 15 Duyệt - NLR 15 20 10 17 25 Duyệt NLR: 15 10 20 17 25 Trường Đại học Bách Khoa Tp.HCM Khoa Khoa học Kỹ thuật Máy tính © 2015 Nguyễn Trung Trực Cấu trúc liệu Giải thuật Chương Cây BST. .. // Duyệt root theo thứ tự NLR void NLR(ref root) { if (IsEmpty(root)) cout