Làm sao để gán tất cả các giá trị ở cây nhị phân sang mảng?

như tiêu đề ạ.
cách làm của e là tìm n: là số node hiện có trong tree. rồi e new int[n] mảng A.
giả sử đã khai báo tree rồi.
truyền vào i=0

 void Gan(Tree t, *&a, int i)
 {
 if(t==NULL) return;
 else
 {
 a[i]=t->info;
 i++;
 Gan(t->pLeft, a,i)
 Gan(t->pRight, a,i)
 }
}

cách này chỉ đúng trong 1 2 trường hợp thôi
e đã thử sửa nhiều rồi mà không được ạ :((, giúp e vs, e cám ơn nhiều !!!

Bạn đệ quy kiểu này sẽ ko kiểm soát được các luồng chạy. Ví dụ nhánh bên trái vừa add info vào a nhưng chưa kịp cộng i lên thì thằng bên phải cũng chạy tới đoạn ghi info --> ghi đè dẫn đến mất thì tin.
Nên khử đệ quy hoặc tạo một cơ chế ghi xuống hiệu quả hơn.

1 Like

dạ e cám ơn ạ!
mọi người có thể chỉ rõ cách làm cho e được k ạ :frowning:

Sửa thành

Gan(t->pLeft, a, i+1);
Gan(t->pRight, a, i+1);

P/s: mình chỉ né thằng i++ ra thôi, sai thuật hay không thì mình không biết.

1 Like

lúc này e cũng có thử cách đó rồi ạ, nhưng vẫn k được luôn,
e có làm cả cách này nữa vẫn ko đc
dd[++i]=t->dg;
khởi tạo i ban đầu là -1.
bài này trên mạng k đâu có luôn, chỉ có 1 chỗ có đề mà k có giải :sob:

Duyêt cây trật rồi, phải là Inorder Traversal: left subtree -> node -> right subtree
Nên wrap trong class Converter, chuyển từ tree sang mảng.

Node *root;
std::vector<int> arr;

void traverse(Node *node)
{
    if (node == nullptr)
        return;

    traverse(node->left);
    arr.push_back(node->value);
    traverse(node->right);
}

void convert()
{
    traverse(root);
}
3 Likes

xl nếu e hỏi ngu ạ, giờ muốn ko dùng thư viện mà chuyển sang mảng động mình khai báo là làm sao ạ :frowning:

Có 2 cách
Duyệt 2 lần, lần đầu lấy số phẩn tử size, lần 2 mới chuyển tùng phần tử từ tree sang array

Duyệt 1 lần, mảng ban đầu tạo với capacity cho trước, như 50. Lúc duyệt chuyển phần tử từ tree sang array. Nếu quá capacity thì tạo mảng mới có capacity + m, m = 16 chẳng hạn, copy mảng cũ qua, rồi duyệt tree tiếp.

2 Likes

Hi Nguyễn Dương.
Vì lý do gì mà bạn không muốn dùng thư viện ? Cơ bản thì tất cả những gì bạn đang dùng đều là thư viện cả.

2 Likes

thực ra là e đang làm cây nhị phân mà info của nó là kiểu cấu trúc gồm có: mã số, tên, họ, tuổi,… nên ở đây dùng thư viện thì e ko áp dụng sang của e :frowning: cách làm của e nó chỉ đúng trong 1 vài trường hợp :fearful:

Hi Nguyễn Dương.
Bạn push thẳng kiểu info vào vector.

2 Likes

*&a là gì nhỉ?
*a là con trỏ
&a là lấy địa chỉ của nó
Vậy *&a đang trỏ đang trỏ chính giá trị của nó hả b?

Đây là C++ bạn :smiley:

int* &a& là kí hiệu tham chiếu, hay a là một tham chiếu đến con trỏ. Nó hay hơn con trỏ ở chỗ cú pháp ngắn gọn và không “trỏ” đi chỗ khác được.

Mà nếu a là tham chiếu thì chỉ cần *a++ = t thôi :slight_smile: dùng wrapper bọc lại.

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