#BST0000019. Xóa nút trong BST (Delete Node in a BST)
Xóa nút trong BST (Delete Node in a BST)
Xóa nút trong BST (Delete Node in a BST)
Nguồn: LeetCode
Phiên bản: Phước Hưng OJ Extended
Đề bài
Dựng một BST từ khóa phân biệt theo đúng thứ tự chèn. Sau đó cần xóa khóa key.
Nếu key không tồn tại, cây giữ nguyên. Nếu nút cần xóa tồn tại:
- nút không có con được loại bỏ trực tiếp;
- nút có đúng một con được thay bằng nút con duy nhất;
- nút có hai con phải được thay bằng inorder successor, tức nút có khóa nhỏ nhất trong cây con phải. Sau đó xóa nút successor ở vị trí cũ.
Quy ước successor ở trường hợp hai con được dùng để cấu trúc cây sau khi xóa là duy nhất trong phiên bản này.
Hãy in preorder của BST sau thao tác.
Input
Dòng đầu chứa số nguyên .
Nếu , dòng tiếp theo chứa khóa phân biệt . Nếu , dòng này không xuất hiện.
Dòng cuối chứa số nguyên key — khóa cần xóa.
Output
Nếu cây sau thao tác không rỗng, in preorder trên một dòng, các khóa cách nhau bởi một dấu cách.
Nếu cây rỗng, in EMPTY.
Subtask
Subtask 1 (20 điểm): .
Subtask 2 (30 điểm): .
Subtask 3 (50 điểm): .
Trong tất cả các subtask, các khóa của cây phân biệt và .
Ví dụ
Input
7
5 3 6 2 4 7 1
3
Output
5 4 2 1 6 7
Giải thích
Trong cây ban đầu, nút có hai con với hai cây con chứa các khóa và . Khóa nhỏ nhất trong cây con phải của là , nên được dùng làm inorder successor.
Sau khi thay bằng và xóa vị trí cũ của , preorder của cây là 5 4 2 1 6 7.