Cũng như thao tác thêm một nút vào trong cây nhị phân tìm kiếm, thao tác hủy một nút trên cây nhị phân tìm kiếm cũng phải bảo đảm cho cây sau khi hủy nút đó thì cây vẫn là một cây nhị phân tìm kiếm. Đây là một thao tác không đơn giản bởi nếu không cẩn thận chúng ta sẽ biến cây thành một rừng.
Giả sử chúng ta cần hủy nút có thành phần dữ liệu (Key) là DelData ra khỏi cây nhị phân tìm kiếm. Điều đầu tiên trong thao tác này là chúng ta phải tìm kiếm địa chỉ của nút cần hủy là DelNode, sau đó mới tiến hành hủy nút có địa chỉ là DelNode này nếu tìm thấy (Do vậy thuật toán này còn được gọi là thuật toán tìm kiếm và loại bỏ trên cây). Quá trình tìm kiếm đã trình bày ở trên, ở đây chúng ta chỉ trình bày thao
Giáo trình: Cấu Trúc Dữ Liệu và Giải Thuật
tác hủy khi tìm thấy nút có địa chỉ DelNode (DelNode->Key = DelData) và trong quá trình tìm kiếm chúng ta giữ địa chỉ nút cha của nút cần hủy là PrDelNode.
Việc hủy nút có địa chỉ DelNode có thể xảy ra một trong ba trường hợp sau:
c1) DelNode là nút lá:
Trong trường hợp này đơn giản chúng ta chỉ cần cắt bỏ mối quan hệ cha-con giữa PrDelNode và DelNode bằng cách cho con trỏ PrDelNode->BST_Left (nếu DelNode là nút con bên trái của PrDelNode) hoặc cho con trỏ PrDelNode->BST_Right (nếu DelNode là nút con bên phải của PrDelNode) về con trỏ NULL và tiến hành hủy (delete) nút có địa chỉ DelNode này.
Ví dụ: Giả sử cần hủy nút có Key = 30 (DelData = 30) BSTree
60
25 PrDelNode 65 19 DelNode 40 NULL NULL
10 NULL 30 44
NULL NULL NULL NULL NULL NULL Trong trường hợp này chúng ta cho PrDelNode->BST_Left = NULL:
BSTree 60
25 PrDelNode 65 19 DelNode 40 NULL NULL
10 NULL NULL 44
30
NULL NULL NULL NULL
Giáo trình: Cấu Trúc Dữ Liệu và Giải Thuật Kết quả sau khi hủy:
BSTree 60 25 PrDelNode 65 19 40 NULL NULL 10 NULL NULL 44
NULL NULL NULL NULL
c2) DelNode là nút chỉ có 01 nút gốc cây con:
Trong trường hợp này cũng khá đơn giản chúng ta chỉ cần chuyển mối quan hệ cha- con giữa PrDelNode và DelNode thành mối quan hệ cha-con giữa PrDelNode và nút gốc cây con của DelNode rồi tiến hành cắt bỏ mối quan hệ cha-con giữa DelNode và 01 nút gốc cây con của nó và tiến hành hủy nút có địa chỉ DelNode này.
Ví dụ: Giả sử cần hủy nút có Key = 19 (DelData = 19) BSTree PrDelNode 60
DelNode 25 65
19 40 NULL NULL
10 NULL 30 44
Giáo trình: Cấu Trúc Dữ Liệu và Giải Thuật Trong trường hợp này chúng ta thực hiện các bước:
B1: PrDelNode->BST_Left = DelNode->BST_Left B2: DelNode->BST_Left = NULL BSTree PrDelNode 60 DelNode 25 65 19 40 NULL NULL 10 NULL NULL 30 44
NULL NULL NULL NULL NULL NULL
Kết quả sau khi hủy:
BSTree PrDelNode 60
25 65
10 40 NULL NULL
NULL NULL 30 44
NULL NULL NULL NULL
c3) DelNode là nút có đủ 02 nút gốc cây con:
Trường hợp này khá phức tạp, việc hủy có thể tiến hành theo một trong hai cách sau đây (có thể có nhiều cách khác nữa song ở đây chúng ta chỉ trình bày hai cách): - Chuyển 02 cây con của DelNode về thành một cây con:
Theo phương pháp này chúng ta sẽ chuyển cây con phải của DelNode (DelNodeBST_Right) về thành cây con phải của cây con có nút gốc là nút phải nhất trong cây con trái của DelNode (phải nhất trong DelNode->BST_Left), hoặc chuyển cây con trái của DelNode (DelNode->BST_Left) về thành cây con trái của cây con có nút gốc là nút trái nhất trong cây con phải của DelNode (trái nhất trong
Giáo trình: Cấu Trúc Dữ Liệu và Giải Thuật
DelNode->BST_Right). Sau khi chuyển thì DelNode sẽ trở thành nút lá hoặc nút chỉ có 01 cây con và chúng ta hủy DelNode như đối với trường hợp c1) và c2) ở trên. Ví dụ: Giả sử cần hủy nút có Key = 25 (DelData = 25). Chúng ta sẽ chuyển cây con
phải của DelNode (DelNode->BST_Right) về thành cây con phải của cây con có nút gốc là nút phải nhất trong cây con trái của DelNode (nút MRNode).
PrDelNode BSTree DelNode 60
MRNode 25 65
19 40 NULL NULL
10 NULL 30 44
NULL NULL NULL NULL NULL NULL Trong trường hợp này chúng ta thực hiện các bước:
B1: MRNode->BST_Right = DelNode->BST_Right B2: DelNode->BST_Right = NULL
PrDelNode BSTree DelNode 60
MRNode 25 65