Cấu trúc dữ liệu di động chuong 4a

70 9 0
  • Loading ...
Loading...
1/70 trang

Thông tin tài liệu

Ngày đăng: 08/09/2017, 16:38

ĐẠI HỌC QUỐC GIA TPHCM TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT CHƯƠNG IV CẤU TRÚC CÂY Nguyễn Trọng Chỉnh chinhnt@uit.edu.vn CẤU TRÚC CÂY ❖KHÁI NIỆM ❖CÂY NHỊ PHÂN ❖CÂY NHỊ PHÂN TÌM KIẾM ❖CÂY NHỊ PHÂN CÂN BẰNG CÂY NHỊ PHÂN TÌM KIẾM ❖ĐỊNH NGHĨA Cây nhị phân tìm kiếm (Binary Search Tree - BST): nhị phân thỏa tính chất: nút k, khóa k lớn khóa tất nút nằm bên trái (nếu có) k nhỏ khóa tất nút nằm bên phải (nếu có) k Mỗi nút nhị phân tìm kiếm gốc nhị phân tìm kiếm CÂY NHỊ PHÂN TÌM KIẾM ❖ĐỊNH NGHĨA T 15 13 14 CÂY NHỊ PHÂN TÌM KIẾM ❖ỨNG DỤNG Cây nhị phân tìm kiếm sử dụng để tăng hiệu tìm kiếm cấu trúc liên kết động nhờ vào thứ tự nút Chí phí tìm kiếm nhị phân tìm kiếm trường hợp xấu h, với h chiều cao Cho T có n phần tử, chiều cao T là: - Trong trường hợp tốt h = log2(n) - Trong trường hợp xấu h = n CÂY NHỊ PHÂN TÌM KIẾM ❖CÁC THAO TÁC - Thêm nút có khóa x Tìm nút có giá trị khóa x Xóa nút có khóa x Hủy toàn CÂY NHỊ PHÂN TÌM KIẾM ❖CÁC THAO TÁC - Thêm nút Thuật toán: Đầu vào: với gốc root, giá trị khóa cần thêm x Đầu ra: với gốc root nút có khóa x B1: Nếu root = NULL pCreateNode(x), rootp,qua B4 B2: Nếu root->key = x qua B4 B3: Nếu root->key < x thực thêm nút vào có gốc root->pRight Ngược lại thực thêm nút vào có gốc root->pLeft B4: Kết thúc CÂY NHỊ PHÂN TÌM KIẾM ❖CÁC THAO TÁC - Thêm nút int Compare(TenDulieu x, TenDulieu y); // trả x=y, -1 x < y x > y int AddNode(TREE &root, TenDulieu x) { Node * p; if (root == NULL) { p = CreateNode(x); if (p == NULL) return -1; root = p; return 1; } CÂY NHỊ PHÂN TÌM KIẾM if (Compare(root->key, x) == 0) return 0; if (Compare(root->key, x) == 1) return AddNode(root->pLeft, x); else return AddNode(root->pRight, x); } CÂY NHỊ PHÂN TÌM KIẾM ❖CÁC THAO TÁC - Ví dụ: Viết chương trình nhập vào dãy số nguyên tạo nhị phân tìm kiếm từ dãy số nguyên theo thứ tự nhập, cho biết trình tạo nhị phân với dãy số nguyên 10 CÂY NHỊ PHÂN CÂN BẰNG ❖CÁC THAO TÁC TRÊN CÂY AVL - Thêm nút có khóa x: trả -1 không đủ nhớ, tồn nút x, thêm thành công không thay đổi chiều cao, thêm thành công thay đổi chiều cao int Compare(TenDulieu x, TenDulieu x); int AddAVLNode(AVLTREE &T, TenDulieu x) { int ret; if (T == NULL) { T = CreateAVLNode(x); if (T== NULL) return -1; else return 2; } 56 CÂY NHỊ PHÂN CÂN BẰNG if (Compare(T->key, x) == 0) return 0; if (Compare(T->key, x) > 0) { ret = AddAVLNode(T->pLeft, x); if (ret < 2) return ret; switch(T->balFactor) { case RH: T->balFactor = EH; return 1; case EH: T->balFactor = LH; return 2; case LH: BalanceLeft(T); return 1; } } 57 CÂY NHỊ PHÂN CÂN BẰNG else { ret = AddAVLNode(T->pRight, x); if (ret < 2) return ret; switch(T->balFactor) { case LH: T->balFactor = EH; return 1; case EH: T->balFactor = RH; return 2; case RH: BalanceRight(T); return 1; } } return 0; } 58 CÂY NHỊ PHÂN CÂN BẰNG ❖CÁC THAO TÁC TRÊN CÂY AVL - Hủy nút có khóa x: Khi hủy nút, cần đảm bảo tính chất cân cách: B1) Hủy nút có khóa x tương tự nhị phân tìm kiếm B2) Xét nút từ vị trí nút cha nút bị hủy gốc để xác định nút p cân B3) Cân nút p B4) Tiếp tục tìm nút cân từ nút p vế nút gốc cân nút 59 CÂY NHỊ PHÂN CÂN BẰNG ❖CÁC THAO TÁC TRÊN CÂY AVL - Hủy nút có khóa x: không tồn nút x, hủy thành công không thay đổi chiều cao, hủy thành công thay đổi chiều cao int AVLSearchStandFor(AVLTREE &p, AVLTREE &q); int DeleteAVLNode(AVLTREE &T, TenDulieu x) { int ret; AVLNode *p; if (T == NULL) return 0; if (Compare(T->key, x) > 0) { ret = DeleteAVLNode(T->pLeft, x); if (ret < 2) return ret; 60 CÂY NHỊ PHÂN CÂN BẰNG switch (T->balFactor) { case LH: T->balFactor = EH; return 2; case EH: T->balFactor = RH; return 1; case RH: return BalanceRight(T); } } 61 CÂY NHỊ PHÂN CÂN BẰNG if (Compare(T->key, x) < 0) { ret = DeleteAVLNode(T->pRight, x); if (ret < 2) return ret; switch (T->balFactor) { case RH: T->balFactor = EH; return 2; case EH: T->balFactor = LH; return 1; case LH: return BalanceLeft(T); } } 62 CÂY NHỊ PHÂN CÂN BẰNG p = T; if (T->pLeft == NULL) { T = T->pRight; ret = 2; } else if (T->pRight == NULL) { T = T->pLeft; ret = 2; } else { ret = AVLSearchStandFor(p, T->pRight); if (ret < 2) return ret; switch (T->balFactor) { case RH: T->balFactor = EH; return 2; case EH: T->balFactor = LH; return 1; case LH: return BalanceLeft(T); } } 63 CÂY NHỊ PHÂN CÂN BẰNG delete p; return ret; } 64 CÂY NHỊ PHÂN CÂN BẰNG int AVLSearchStandFor(AVLTREE &p, AVLTREE &q) { int ret; if (q->pLeft) { ret = AVLSearchStandFor(p, q->pLeft); if (ret < 2) return ret; switch (q->balFactor) { case LH: q->balFactor = EH; return 2; case EH: q->balFactor = RH; return 1; case RH: return BalanceRight(q); } } 65 CÂY NHỊ PHÂN CÂN BẰNG else { p->key = q->key; p = q; q = q->pRight; return 2; } return 0; } 66 CÂY NHỊ PHÂN CÂN BẰNG Xóa nút x=20 50 20 70 35 82 61 37 36 66 54 57 74 71 85 90 73 67 CÂY NHỊ PHÂN CÂN BẰNG Xóa nút x=20 50 20 70 35 82 61 37 36 66 54 57 74 71 85 90 73 68 CÂY NHỊ PHÂN CÂN BẰNG Xóa nút x=20 50 70 36 35 82 61 37 66 54 57 74 71 85 90 73 69 CÂY NHỊ PHÂN CÂN BẰNG Xóa nút x=20 70 82 50 61 36 35 66 54 37 74 57 71 85 90 73 70 ... 14 CÂY NHỊ PHÂN TÌM KIẾM ❖ỨNG DỤNG Cây nhị phân tìm kiếm sử dụng để tăng hiệu tìm kiếm cấu trúc liên kết động nhờ vào thứ tự nút Chí phí tìm kiếm nhị phân tìm kiếm trường hợp xấu h, với h chiều...CẤU TRÚC CÂY ❖KHÁI NIỆM ❖CÂY NHỊ PHÂN ❖CÂY NHỊ PHÂN TÌM KIẾM ❖CÂY NHỊ PHÂN CÂN BẰNG CÂY NHỊ PHÂN TÌM
- Xem thêm -

Xem thêm: Cấu trúc dữ liệu di động chuong 4a , Cấu trúc dữ liệu di động chuong 4a , Cấu trúc dữ liệu di động chuong 4a

Gợi ý tài liệu liên quan cho bạn

Nhận lời giải ngay chưa đến 10 phút Đăng bài tập ngay
Nạp tiền Tải lên
Đăng ký
Đăng nhập