Không thêm phần tử vào cây nhị phân được

hàm SetLeft và SetRight của em bị sai ở chỗ nào mà em không thêm phần tử vào cây nhị phân được ạ

#include <iostream>
using namespace std;
struct Node
{
    int info;
    Node *pLeft, *pRight;
};
typedef Node *Tree;
Node *getNode(int x)
{
    Node *p = new Node;
    p->info = x;
    p->pLeft = p->pRight = NULL;
    return p;
}
Node *Search(Tree T, int b)
{
    if (!T)
        return NULL;
    if (T->info > b)
        return Search(T->pLeft, b);
    else if (T->info < b)
        return Search(T->pRight, b);
    else
        return T;
}
void SetLeft(Node *K, int c)
{
    if (K == NULL)
    {
        cout << "Node khong ton tai\n";
        return;
    }
    if (K->pLeft->info == c)
    {
        cout << "Da co node con ben trai\n";
        return;
    }
    K->pLeft->info = c;
    return;
}
void SetRight(Node *K, int c)
{
    if (K == NULL)
    {
        cout << "Node khong ton tai\n";
        return;
    }
    if (K->pRight->info == c)
    {
        cout << "Da co node con ben phai\n";
        return;
    }
    K->pRight->info = c;
    return;
}
void LNR(Tree T)
{
    if (T)
    {
        LNR(T->pLeft);
        cout << T->info << " ";
        LNR(T->pRight);
    }
}
int main()
{
    Tree T = NULL;
    int x, b, c;
    char a;
    cin >> x;
    T = getNode(x); // Tạo nút gốc
    while (true)
    {
        cin >> a; // Ký tự cho biết chèn vào trái hay phải
        if (a != 'L' && a != 'R')
            break; // Nếu không phải L hoặc R thì kết thúc việc tạo cây
        cin >> b >> c;
        if (a == 'L')
            SetLeft(Search(T, b), c); // tìm nút có giá trị b, nếu có chèn c vào bên trái b
        else if (a == 'R')
            SetRight(Search(T, b), c); //  tìm nút có giá trị b, nếu có chèn c vào bên phải b
    }
    cout << "\nLNR: ";
    LNR(T);
    cout << endl;
    return 0;
}
void SetLeft(Node *K, int c)
{
    if (K == NULL)
    {
        cout << "Node khong ton tai\n";
        return;
    }
    if (K->pLeft->info == c) // Bạn đặt in log ở đây xem K->pLeft có đang NULL hay không
    {
        cout << "Da co node con ben trai\n";
        return;
    }
    K->pLeft->info = c;
    return;
}
void SetRight(Node *K, int c)
{
    if (K == NULL)
    {
        cout << "Node khong ton tai\n";
        return;
    }
    if (K->pRight->info == c) // Bạn đặt in log ở đây xem pRight có đang NULL hay không
    {
        cout << "Da co node con ben phai\n";
        return;
    }
    K->pRight->info = c;
    return;
}

Mình có sửa lại như này nhưng vẫn không thêm phần tử được ạ

Node *Search(Tree T, int b)
{
    if (T)
    {
        if (T->info == b)
            return T;
        Search(T->pLeft, b);
        Search(T->pRight, b);
    }
    return NULL;
}
void SetLeft(Node *K, int c)
{
    if (K == NULL)
    {
        cout << "Node khong ton tai\n";
        return;
    }
    if (K->pLeft != NULL)
    {
        cout << "Da co node con ben trai\n";
        return;
    }
    K->pLeft->info = c;
    return;
}
void SetRight(Node *K, int c)
{
    if (K == NULL)
    {
        cout << "Node khong ton tai\n";
        return;
    }
    if (K->pRight != NULL)
    {
        cout << "Da co node con ben phai\n";
        return;
    }
    K->pRight->info = c;
    return;
}

Bởi vì trong trường hợp node bên phải (hoặc bên trái) của node bạn tìm thấy đang là NULL, thì

K->pLeft->info = c;
// và
K->pRight->info = c;

sẽ khiến chương trình của bạn bị crash. Bạn không thể gán value info cho một con trỏ NULL được.

Mình nghĩ thay vì gán trường info cho con trỏ pLeft (hoặc pRight), thì bạn gán thẳng 1 node cho con trỏ pLeft (hoặc pRight) sẽ hợp lý hơn.

3 Likes

à nhỉ mình quên mất, vậy là chỉ việc K->pLeft = getNode(c). Cảm ơn bạn

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?