thắc mắc Xóa node trong cây nhị phân tìm kiếm

C++:
void Remove(BST *pRoot, int data)
{
    if(pRoot == NULL)
    {
        return;
    }
    if(data > pRoot->key)
    Remove(pRoot->pRight,data);
    else if(data < pRoot->key)
    Remove(pRoot->pLeft,data);
    else
    {
     // Node lá -> xóa trực tiếp
        if(pRoot->pLeft == NULL && pRoot->pRight == NULL)
        {
            BST *p = pRoot;
            free(p);
        }
     // Node có 1 con trái hoặc phải -> Thay đổi giá trị của node cần xóa với node con, sau đó xóa node con
        else if(pRoot->pRight == NULL)
        {
            BST *p = pRoot->pLeft;
            *pRoot = *p;
            free(p);
        }
         else if(pRoot->pLeft == NULL)
        {
            BST *p = pRoot->pRight;
            *pRoot = *p;
            free(p);
        }
 
   // Node có 2 con -> Tìm node nhỏ nhất bên cây con phải, hoán đổi giá trị với node cần xóa sau đó gọi đệ quy xóa node nhỏ nhất
        else
        {
            BST *p = minValueNode(pRoot->pRight);
            pRoot->key = p->key;
            Remove(pRoot->pRight, p->key);
        }
    }
}

Các bác cho hỏi: em đang viết hàm xóa node có giá trị bất kì trong cây nhị phân: node 1 con, node 2 con, node lá. Nhưng không hiểu sao khi debug thì nó cứ báo lỗi segment fault. Chạy trên compiler online thì nó lại thay mấy cái giá trị rác vô node cần xóa. Code trên của em có lỗi ở chỗ nào không ạ?
 
Sửa lần cuối:
theo mình hiểu thì để xoá một node bạn cần ngắt đường đi của node cha tới node đó và giải phóng ô nhớ tại node đó, ở đây mình thấy bạn chỉ mới giải phóng ô nhớ.

Sent from Xiaomi Redmi Note 8 using vozFApp
 
theo mình hiểu thì để xoá một node bạn cần ngắt đường đi của node cha tới node đó và giải phóng ô nhớ tại node đó, ở đây mình thấy bạn chỉ mới giải phóng ô nhớ.

Sent from Xiaomi Redmi Note 8 using vozFApp

Em đọc trên greeksforgreeks thì không thấy nó ngắt đường đi ạ.
 
bạn tạo node bằng malloc hay new, tại dùng free thì k match với new nên có thể nó lỗi
 
bạn up full code lên được k

Dạ đây.

C++:
#include <iostream>
using namespace std;
struct NODE {
    int key;
    NODE *pLeft;
    NODE *pRight;
};
NODE *createNode(int x)
{
    NODE *p = new NODE;
    p->key = x;
    p->pLeft = p->pRight = NULL;
    return p;
}
void Insert(NODE* &pRoot, int x)
{
    if(pRoot == NULL) pRoot = createNode(x);
    if(x > pRoot->key) Insert(pRoot->pRight,x);
    else if(x < pRoot->key) Insert(pRoot->pLeft,x);
    else return;
}

NODE *minValueNode(NODE *pRoot)
{
     NODE *current = pRoot;
     while(current && current->pLeft != NULL) current = current->pLeft;
     return current;
}

void Remove(NODE*pRoot, int data)
{
    if(pRoot == NULL)
    {
        return;
    }
    if(data > pRoot->key)
    Remove(pRoot->pRight,data);
    else if(data < pRoot->key)
    Remove(pRoot->pLeft,data);
    else
    {
     // Node lá -> xóa trực tiếp
        if(pRoot->pLeft == NULL && pRoot->pRight == NULL)
        {
            NODE *p = pRoot;
            delete p;
        }
     // Node có 1 con trái hoặc phải -> Thay đổi giá trị của node cần xóa với node con, sau đó xóa node con
        else if(pRoot->pRight == NULL)
        {
            NODE *p = pRoot->pLeft;
            *pRoot = *p;
            free(p);
        }
         else if(pRoot->pLeft == NULL)
        {
            NODE*p = pRoot->pRight;
            *pRoot = *p;
            free(p);
        }
 
   // Node có 2 con -> Tìm node nhỏ nhất bên cây con phải, hoán đổi giá trị với node cần xóa sau đó gọi đệ quy xóa node nhỏ nhất
        else
        {
            NODE*p = minValueNode(pRoot->pRight);
            pRoot->key = p->key;
            Remove(pRoot->pRight, p->key);
        }
    }
}

void Inorder(NODE *pRoot) {
    if(pRoot == NULL) return;
    Inorder(pRoot->pLeft);
    cout << pRoot->key << " ";
    Inorder(pRoot->pRight);
}

int main()
{
    NODE *p = NULL;
    Insert(p,4);
    Insert(p,5);
    Insert(p,6);
    Insert(p,3);
    Insert(p,8);
    Inorder(p);
    cout << endl;
    Remove(p,4);
    Inorder(p);
    return 0;
}
 
ChatGPT trả lời nhé :

1671504285442.png

1671504364920.png
 

Thống kê chủ đề

Ngày tạo
Siêu Nhân Toán Học,
Người trả lời cuối
haiauluotgio,
Trả lời
14
Lượt xem
2.524
Quay lại
Lên đầu trang