Mình đang viết code về xóa một phần tử trong cây nhị phân, hàm của mình như sau:
Trong đó hàm E_Replace() dùng để tìm phần tử thay thế cho phần tử cần xóa.
Mình gặp một lỗi mà mình không giải thích được.
Bây giờ mình nhập theo thứ tự là 5 3 4, nghĩa là cây nó như thế này:
5
/
3
\
4
Mình muốn xóa số 4, kết quả là
5
/
3
Kết quả này đúng.
Nhưng bây giờ mình muốn xóa số 5, kết quả lại là
4
/
3
\
4
Khi xóa số 5, có nghĩa là nó sẽ lấy số 4 thế vào chỗ của nó và xóa số 4 đi.
Để ý chỗ dòng màu đỏ. Khi xóa số 4 thì dòng này được thực hiện và khi xóa số 5 cũng vậy. Với S là địa chỉ của số 4. Vậy tại sao khi xóa số 4 thì số 4 mất còn xóa số 5 thì số 4 lại còn đó.
Mình đã kiểm tra nhiều lần, thậm chí đã thay S trên dòng màu đỏ bằng R->Left->Right để chắc chắn lấy đúng địa chỉ của số 4 nhưng vẫn như vậy.
Code:
//Trường hợp đầu tiên : Cây chỉ có 1 phần tử và phần tử muốn xóa là phần tử duy nhất trong cây void Delete_Case1(Node* &R,Node* &S){ if (R==S&&E_Replace(R)==NULL) R=NULL; else Delete_Case2(R,S); } //Trường hợp 2 : Phần tử muốn xóa là phần tử bất kì của cây có nhiều hơn 1 phần tử void Delete_Case2(Node* &R,Node* &S){ while (E_Replace(S)){ S->Data=E_Replace(S)->Data; S=E_Replace(S); } Delete_Case3(R,S); //[COLOR="#FF0000"]<<<<<<<------------------Để ý chỗ này[/COLOR] } //Trường hợp 3: Phần tử muốn xóa là phần tử lá //Hàm sẽ tìm tới Node cha và thay đổi con trỏ trỏ vào Node muốn xóa thành NULL void Delete_Case3(Node* &R,Node* &S){ if (R->Left==S){ R->Left=NULL; return; } if (R->Right==S){ R->Right=NULL; return; } if (S->Data<R->Data) Delete_Case3(R->Left,S); if (S->Data>R->Data) Delete_Case3(R->Right,S); }
Code:
Node *Max(Node *R){ if (R) while (R->Right) R=R->Right; return R; } Node *Min(Node *R){ if (R) while (R->Left) R=R->Left; return R; } Node *E_Replace(Node *R){ if (R->Left) return Max(R->Left); if (R->Right) return Min(R->Right); return NULL; }
Bây giờ mình nhập theo thứ tự là 5 3 4, nghĩa là cây nó như thế này:
5
/
3
\
4
Mình muốn xóa số 4, kết quả là
5
/
3
Kết quả này đúng.
Nhưng bây giờ mình muốn xóa số 5, kết quả lại là
4
/
3
\
4
Khi xóa số 5, có nghĩa là nó sẽ lấy số 4 thế vào chỗ của nó và xóa số 4 đi.
Để ý chỗ dòng màu đỏ. Khi xóa số 4 thì dòng này được thực hiện và khi xóa số 5 cũng vậy. Với S là địa chỉ của số 4. Vậy tại sao khi xóa số 4 thì số 4 mất còn xóa số 5 thì số 4 lại còn đó.
Mình đã kiểm tra nhiều lần, thậm chí đã thay S trên dòng màu đỏ bằng R->Left->Right để chắc chắn lấy đúng địa chỉ của số 4 nhưng vẫn như vậy.
Comment