Giáo trình: Cấu Trúc Dữ Liệu và Giải Thuật Trang: 163 nút không phải là nút lá thì chúng ta phải tìm cách chuyển các nút gốc cây con là các nút con của nút cần hủy thành các nút gốc cây con của các nút khác rồi mới tiến hành hủy nút này. - Trường hợp nếu nút cần hủy chỉ có 01 nút gốc cây con thì chúng ta có thể chuyển nút gốc cây con này thành nút gốc cây con của nút cha của nút cần hủy. - Trường hợp nếu nút cần hủy có 2 nút gốc cây con thì chúng ta phải chuyển 02 nút gốc cây con này thành nút gốc cây con của các nút khác với nút cần hủy. Việc chọn các nút để làm nhiệm vụ nút cha của các nút gốc cây con này tùy vào từng trường hợp cụ thể của cây nhò phân mà chúng ta sẽ lựa chọn cho phù hợp. Do vậy, thao tác hủy một nút sẽ được trình bày cụ thể trong các loại cây cụ thể được trình bày ở các phần sau. 5.2.3. Cây nhò phân tìm kiếm (Binary Searching Tree) A. Khái niệm – Cấu trúc dữ liệu: Cây nhò phân tìm kiếm là cây nhò phân có thành phần khóa của mọi nút lớn hơn thành phần khóa của tất cả các nút trong cây con trái của nó và nhỏ hơn thành phần khóa của tất cả các nút trong cây con phải của nó. Ví dụ: Hình ảnh sau là hình ảnh của một cây nhò phân tìm kiếm BSTree 60 25 65 19 40 NULL NULL 10 NULL 30 44 NULL NULL NULL NULL 50 15 NULL NULL NULL NULL Từ khái niệm này chúng ta có một số nhận xét: - Cấu trúc dữ liệu của cây nhò phân tìm kiếm là cấu trúc dữ liệu để biểu diễn các cây nhò phân nói chung. typedef struct BST_Node { T Key; BST_Node * BST_Left; // Vùng liên kết quản lý đòa chỉ nút gốc cây con trái BST_Node * BST_Right; // Vùng liên kết quản lý đòa chỉ nút gốc cây con phải } BST_OneNode; Click to buy NOW! P D F - X C h a n g e V i e w e r w w w . d o c u - t r a c k . c o m Click to buy NOW! P D F - X C h a n g e V i e w e r w w w . d o c u - t r a c k . c o m . Giáo trình: Cấu Trúc Dữ Liệu và Giải Thuật Trang: 164 typedef BST_OneNode * BST_Type; Để quản lý các cây nhò phân tìm kiếm chúng ta cần quản lý đòa chỉ nút gốc của cây: BST_Type BSTree; - Khóa nhận diện (Key) của các nút trong cây nhò phân tìm kiếm đôi một khác nhau (không có hiện tượng trùng khóa). Tuy nhiên trong trường hợp cần quản lý các nút có khóa trùng nhau trong cây nhò phân tìm kiếm thì chúng ta có thể mở rộng cấu trúc dữ liệu của mỗi nút bằng cách thêm thành phần Count để ghi nhận số lượng các nút trùng khóa. Khi đó, cấu trúc dữ liệu để quản lý các cây nhò phân tìm kiếm được mở rộng như sau: typedef struct BSE_Node { T Key; int Count; BSE_Node * BSE_Left; // Vùng liên kết quản lý đòa chỉ nút gốc cây con trái BSE_Node * BSE_Right; // Vùng liên kết quản lý đòa chỉ nút gốc cây con phải } BSE_OneNode; typedef BSE_OneNode * BSE_Type; và chúng ta quản lý cây nhò phân tìm kiếm này bằng cách quản lý đòa chỉ nút gốc: BSE_Type BSETree; - Nút ở bên trái nhất là nút có giá trò khóa nhận diện nhỏ nhất và nút ở bên phải nhất là nút có giá trò khóa nhận diện lớn nhất trong cây nhò phân tìm kiếm. - Trong một cây nhò phân tìm kiếm thứ tự duyệt cây Left – Root – Right là thứ tự duyệt theo sự tăng dần các giá trò của Key trong các nút và thứ tự duyệt cây Right – Root – Left là thứ tự duyệt theo sự giảm dần các giá trò của Key trong các nút. B. Các thao tác trên cây nhò phân tìm kiếm: a. Tìm kiếm trên cây: Giả sử chúng ta cần tìm trên cây nhò phân tìm kiếm xem có tồn tại nút có khóa Key là SearchData hay không. Để thực hiện thao tác này chúng ta sẽ vận dụng thuật toán tìm kiếm nhò phân: Do đặc điểm của cây nhò phân tìm kiếm thì tại một nút, nếu Key của nút này khác với SearchData thì SearchData chỉ có thể tìm thấy hoặc trên cây con trái của nút này nếu SearchData nhỏ hơn Key của nút này hoặc trên cây con phải của nút này nếu SearchData lớn hơn Key của nút này. - Thuật toán tìm kiếm 1 nút trên cây nhò phân tìm kiếm: B1: CurNode = BSTree B2: IF (CurNode = NULL) or (CurNode->Key = SearchData) Thực hiện Bkt B3: IF (CurNode->Key > SearchData) // Tìm kiếm trên cây con trái CurNode = CurNode->BST_Left B4: ELSE // Tìm kiếm trên cây con phải CurNode = CurNode->BST_Right B5: Lặp lại B2 Click to buy NOW! P D F - X C h a n g e V i e w e r w w w . d o c u - t r a c k . c o m Click to buy NOW! P D F - X C h a n g e V i e w e r w w w . d o c u - t r a c k . c o m . Giáo trình: Cấu Trúc Dữ Liệu và Giải Thuật Trang: 165 Bkt: Kết thúc - Minh họa thuật toán: Giả sử chúng ta cần tìm kiếm nút có thành phần dữ liệu là 30 trên cây nhò phân tìm kiếm sau: SearchData = 30 CurNode BSTree 60 25 65 19 40 NULL NULL 10 NULL 30 44 NULL NULL NULL NULL 50 15 NULL NULL NULL NULL CurNode->Key > SearchData // Tìm kiếm trên cây con trái ⇒ CurNode = CurNode->BST_Left BSTree CurNode 60 25 65 19 40 NULL NULL 10 NULL 30 44 NULL NULL NULL NULL 50 15 NULL NULL NULL NULL Click to buy NOW! P D F - X C h a n g e V i e w e r w w w . d o c u - t r a c k . c o m Click to buy NOW! P D F - X C h a n g e V i e w e r w w w . d o c u - t r a c k . c o m . Giáo trình: Cấu Trúc Dữ Liệu và Giải Thuật Trang: 166 CurNode->Key < SearchData // Tìm kiếm trên cây con phải ⇒ CurNode = CurNode->BST_Right BSTree 60 25 CurNode 65 19 40 NULL NULL 10 NULL 30 44 NULL NULL NULL NULL 50 15 NULL NULL NULL NULL CurNode->Key > SearchData // Tìm kiếm trên cây con trái ⇒ CurNode = CurNode->BST_Left BSTree 60 25 65 19 CurNode 40 NULL NULL 10 NULL 30 44 NULL NULL NULL NULL 50 15 NULL NULL NULL NULL CurNode->Key = SearchData ⇒ Thuật toán kết thúc (Tìm thấy) Click to buy NOW! P D F - X C h a n g e V i e w e r w w w . d o c u - t r a c k . c o m Click to buy NOW! P D F - X C h a n g e V i e w e r w w w . d o c u - t r a c k . c o m . Giáo trình: Cấu Trúc Dữ Liệu và Giải Thuật Trang: 167 Bây giờ giả sử chúng ta cần tìm kiếm nút có thành phần dữ liệu là 35 trên cây nhò phân tìm kiếm trên: SearchData = 35 CurNode BSTree 60 25 65 19 40 NULL NULL 10 NULL 30 44 NULL NULL NULL NULL 50 15 NULL NULL NULL NULL CurNode->Key > SearchData // Tìm kiếm trên cây con trái ⇒ CurNode = CurNode->BST_Left BSTree CurNode 60 25 65 19 40 NULL NULL 10 NULL 30 44 NULL NULL NULL NULL 50 15 NULL NULL NULL NULL Click to buy NOW! P D F - X C h a n g e V i e w e r w w w . d o c u - t r a c k . c o m Click to buy NOW! P D F - X C h a n g e V i e w e r w w w . d o c u - t r a c k . c o m . . V i e w e r w w w . d o c u - t r a c k . c o m . Giáo trình: Cấu Trúc Dữ Liệu và Giải Thuật Trang: 165 Bkt: Kết thúc - Minh họa thuật toán: Giả sử chúng ta cần tìm kiếm nút có thành phần dữ liệu là 30 trên cây nhò phân tìm kiếm. V i e w e r w w w . d o c u - t r a c k . c o m . Giáo trình: Cấu Trúc Dữ Liệu và Giải Thuật Trang: 167 Bây giờ giả sử chúng ta cần tìm kiếm nút có thành phần dữ liệu là 35 trên cây nhò phân tìm kiếm trên: SearchData. Cây nhò phân tìm kiếm là cây nhò phân có thành phần khóa của mọi nút lớn hơn thành phần khóa của tất cả các nút trong cây con trái của nó và nhỏ hơn thành phần khóa của tất cả các nút trong