Cài đặt cây binary bị lỗi

#include <iostream>

using namespace std;

struct Node
{
    int value;
    Node* left;
    Node* right;

    Node(int value)
    {
        this->right = nullptr;
        this->left = nullptr;
        this->value = value;
    }
};

class Tree
{
private:

    Node* root;

    void InsertNode(Node* current, Node* newNode)
    {

        if(current == nullptr)
        {
            current = newNode;
        }
        else
        {
            if(current->value > newNode->value)
            {
                InsertNode(current->left, newNode);
            }
            else if(current->value < newNode->value)
            {
                InsertNode(current->right, newNode);
            }
        }
        cout <<"add node: " <<current->value << endl;
    }
    void Preoder(Node* current)
    {
        if(current == nullptr) return;

        cout << current->value << endl;
        Preoder(current->left);
        Preoder(current->right);
    }

public:
    Tree()
    {
        this->root = nullptr;
    }
    void Insert(int value)
    {
        Node* newNode = new Node(value);
        InsertNode(this->root, newNode);
    }
    void PreoderTraversal()
    {
        Preoder(this->root);
    }

};

int main()
{
    Tree tree;
    tree.Insert(6);
    tree.Insert(4);
    tree.Insert(8);
    tree.PreoderTraversal();
}

Mình vẫn k hiểu tại sao lỗi nữa :frowning: nó k in ra cây theo pre oder được.

Theo mình thì bạn chưa phân bố bộ nhớ cho nó bằng malloc hoặc calloc gì đó!
Một góp ý nho nhỏ là bạn nên trình bày rõ vấn đề. Trong trường hợp này, thì vấn đề của bạn là nó không in ra thứ tự preorder được, thì bạn post hình lúc bạn run lên và thêm một số thông tin khác để mọi người rõ hơn bạn đang gặp vấn đề chỗ nào.

mình cấp phát rồi mà.

mình có tạo

Node* newNode = new Node(value);

rồi mới truyền vào làm đối số của hàm Insert.

à ừ. Vấn đề nằm ở hàm insert của bạn, cứ sau khi insert 1 node vào thì root của nó lại là nullptr.
Để mình xem thêm

Đây là hàm ok, hàm đấy là hàm chức năng, mình để trong private, hàm gọi nó để ngoài public kìa.

Bạn dùng hàm void nên phải tham chiếu đến địa chỉ con trỏ để thay đổi giá trị nha.
Tại hàm định nghĩa hàm

void InsertNode(Node* current, Node* newNode)

sửa lại thành

void InsertNode(Node* &current, Node* newNode)

là được.

2 Likes

ồ, C++ mh cứ nghĩ truyền con trỏ thì khỏi cần cái ý chứ

Thêm & là cách của C++ :smiley: nói chung vẫn phải thêm, nhưng chỗ caller không cần &.

Tương tự với C ta có const T& để vẫn truyền tham biến nhưng ko sửa được biến đó.

2 Likes

Con trỏ cũng là một loại biến : có địa chỉ và giá trị của con trỏ là địa chỉ một vùng nhớ khác.
Muốn thay đổi giá trị con trỏ phải tham chiếu đến địa chỉ của nó.

1 Like

Nếu dùng ** trên đối số thì cần phải dùng & tại caller.

1 Like

C/C++ si đa quá nhỉ? Phần con trỏ này không cẩn thận thì mệt người!

Nhờ con trỏ mới có mảng “thập cẩm” đấy chứ :smiley: ntn:

arr = [1, 2.2, "abc", ["def", 456]]

2 Likes

python hỗ trợ đầy luôn! :))

mình chỉ nghỉ cách thập cẩm là chuyển hết sang dạng string thôi, ý tưởng làm mảng động mà mỗi phần tử một loại như thế kiểu gì vậy bạn.

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