10 binary search tree

7 2 0
10 binary search tree

Đang tải... (xem toàn văn)

Thông tin tài liệu

5/15/2019 Cây Nhị Phân Tìm Kiếm – Binary Search Tree • Là nhị phân CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT Data Structures & Algorithms CÂY NHỊ PHÂN TÌM KIẾM – BINARY SEARCH TREE • Giá trị node lớn giá trị node nhánh trái nhỏ giá trị node nhánh phải Nút có giá trị nhỏ nằm 36 nút trái 15 40 23 Nút có giá trị lớn nằm nút phải Nhờ cấu trúc Định hướng tìm kiếm Đặc điểm Binary Search Tree Cây Nhị Phân Tìm Kiếm – Binary Search Tree Dễ dàng tạo liệu xếp tìm kiếm Có thứ tự Khơng có phần tử trùng Các thao tác Binary Search Tree Các thao tác Binary Search Tree Tạo node có key x Tạo rỗng Key=x TNode *CreateTNode(KDL x) { TNode *p; p = new TNode; //cấp phát vùng nhớ động pLeft if(p==NULL) return NULL; // thoát NULL else { p->key = x; //gán trường liệu nút = x p->pLeft = NULL; p->pRight = NULL; } return p; } • Cây rỗng -> địa nút gốc NULL void CreateTree(TREE &T) { T=NULL; } pRight NULL 5/15/2019 Tạo Các thao tác Binary Search Tree Thêm node vào – Tạo - Sau thêm đảm bảo nhị phân tìm kiếm 36 36 15 40 174 Hãy vẽ nhị phân tìm kiếm lập từ dãy số sau theo chiều từ trái qua phải  15 40 Nếu node cần thêm nhỏ node xét thêm bên 36 15 trái 40  Ngược lại thêm bên phải Tạo – Ví dụ Thêm node vào Binary Search Tree int InsertNode (Tree & t, int x) { if(t!=NULL) { if(x==t->key) return 0; //Có giá trị trùng else { if(xkey) InsertNode(t->pLeft, x); else InsertNode(t->pRight, x); } } else { t= new TNode; if(t==NULL) return -1; //Thiếu nhớ t->key=x; t->pLeft=t->pRight=NULL; return 1; //Thêm thành cơng } } Bài tốn 1: Vẽ nhị phân tìm kiếm từ dãy số Vẽ nhị phân tìm kiếm (chỉ vẽ kết quả) từ dãy số nguyên xây dựng theo thứ tự từ trái qua phải dãy số: 72; 67; 73; 58;5; 4; 27; 53; 61; 32 Làm theo nguyên tắc thêm node vào cây: * Luôn bắt đầu so sánh từ node gốc * Đảm bảo đăc điểm lớn bên phải, nhỏ bên trái Tạo – Ví dụ Các thao tác Binary Search Tree Duyệt 9, 5, 4, 8, 6, 3, 14,12,13 Duyệt trước (pre-oder) 14 10 Duyệt (in-oder) Duyệt sau (post-oder) 12 13 11 12 5/15/2019 Các thao tác Binary Search Tree Các thao tác Binary Search Tree  Cho nhị phân tìm kiếm duyệt theo thứ tự yêu cầu NLR NRL NLR LNR RNL 36 LRN RLN  Cho nhị phân tìm kiếm duyệt theo thứ tự yêu cầu 15 40 23 void NLR (Tree t) { if(t!=NULL) { coutpLeft); coutpRight); coutkey) return SearchTNode(T->pRight,x); else return SearchTNode(T->pLeft,x); } return NULL; } TNode * searchNode(TREE Root, Data x) { TNode *p = Root; while (p != NULL) { if(x == p->Key) return p; else if(x < p->Key) p = p->pLeft; else p = p->pRight; } return NULL; 88 13 15 21 44 Tìm X=55 23 24 } 5/15/2019 Binary Search Tree – Bài tập Binary Search Tree – Bài tập Cho nhị phân tìm kiếm, node có giá trị nguyên, định nghĩa hàm sau: In node có giá trị chẵn In node có giá trị lớn x Đếm số node Tính độ cao Tìm node có giá trị x Tìm node có giá trị lớn Tìm node có giá trị nhỏ phải Đếm số node (node bậc 0) Đếm số node có (node bậc 1) 10 Đếm số node có phải 11 Đếm số node có trái 12 Đếm số node (node bậc 2) 13 In node mức 14 Cho biết độ dài đường từ gốc đến node x 25 26 Các thao tác Binary Search Tree Các thao tác Binary Search Tree TH1:Xóa node không ảnh hưởng đến nút khác Xóa node Hủy phần tử phải đảm bảo điều kiện ràng buộc Cây nhị phân tìm kiếm Có trường hợp hủy nút 36  Xóa node giá trị 36 TH1: X nút TH2: X có (cây trái phải) TH3: X có đầy đủ 15 40 23 15 40  Xóa node giá trị 40 23 27 28 Các thao tác Binary Search Tree TH2 Xóa node có Các thao tác Binary Search Tree 44 TH3 Xóa node có Hủy X=37 18 13 59 37 15 23 Tìm phần tử mạng cho phần tử cần xóa 88 55 108 71 Trước xố x ta móc nối cha x với x 29 Có cách tìm nút mạng  C1: Nút có khố nhỏ (trái nhất) bên phải node cần xóa  C2: Nút có khố lớn (phải nhất) bên trái node cần xóa 30 5/15/2019 Các thao tác Binary Search Tree Các thao tác Binary Search Tree TH3 Xóa node có Bước 1: Tìm node mạng • Cách 1: Tìm node trái phải • Cách 2: Tìm node phải trái Bước 2: Thay giá trị node mạng vào node cần xóa Bước 3: Xóa node mạng Xóa node có giá trị 36 15 36 36 Bước 1: Tìm node mạng nhỏ bên phải lớn bên trái node 36 40 15 23 40 23 Node mạng 16 16 31 32 Các thao tác Binary Search Tree Các thao tác Binary Search Tree Xóa node có giá trị 36 36 23 Xóa node có giá trị 36 Bước 2: Thay giá trị node mạng cho node cần xóa 15 36 23 Cập nhật giá trị 40 23 Bước 3: Xóa node mạng 15 Node mạng 16 40 23 Node mạng 16 33 void Remove(Tree & t, int x) { if (t != NULL) { if (x < t->key) Remove(t->pLeft, x); else if (x > t->key) Remove(t->pRight, x); else { TNode * pHuy = t; if (t->pLeft == NULL) t = t->pRight; else if (t->pRight == NULL) t = t->pLeft; else SearchStandFor(pHuy, t->pRight); 34 void SearchStandFor(Tree &pHuy, Tree &pTM) { if(pTM->pLeft!=NULL) SearchStandFor(pHuy, pTM->pLeft); else { pHuy->key=pTM->key; pHuy=pTM; pTM=pTM->pRight; } } delete pHuy; } } } 35 36 5/15/2019 Binary Search Tree – Bài tập Slide tham khảo từ Cho dãy số theo thứ tự nhập từ trái sang phải: 20, 15, • Slide tham khảo từ: • Slide CTDL GT, Khoa Khoa Học Máy Tính, ĐHCNTT 35, 30, 11, 13, 17, 36, 47, 16, 38, 28, 14 • Congdongcviet.com • Vẽ nhị phân tìm kiếm cho dãy số • Cplusplus.com • Trình bày bước vẽ lại sau xoá nút: 11 35 37 38 39 ... thao tác Binary Search Tree 59 37 23 40 55 108 71 Tìm thấy X=55 22 Các thao tác Binary Search Tree Tìm node có key x – Khơng dùng đê quy Tìm node có key x – dùng đê quy TNode *SearchTNode (TREE. .. Binary Search Tree Duyệt 9, 5, 4, 8, 6, 3, 14,12,13 Duyệt trước (pre-oder) 14 10 Duyệt (in-oder) Duyệt sau (post-oder) 12 13 11 12 5/15/2019 Các thao tác Binary Search Tree Các thao tác Binary. .. 28 Các thao tác Binary Search Tree TH2 Xóa node có Các thao tác Binary Search Tree 44 TH3 Xóa node có Hủy X=37 18 13 59 37 15 23 Tìm phần tử mạng cho phần tử cần xóa 88 55 108 71 Trước xố

Ngày đăng: 25/02/2023, 15:25

Tài liệu cùng người dùng

Tài liệu liên quan