01/10/2018, 15:48

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 !!!

Trọng Nghĩa viết 17:50 ngày 01/10/2018

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.

Nguyễn Dương viết 17:53 ngày 01/10/2018

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

HK boy viết 18:01 ngày 01/10/2018

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

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.

Nguyễn Dương viết 17:52 ngày 01/10/2018

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

Hung viết 17:56 ngày 01/10/2018

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);
}
Nguyễn Dương viết 18:05 ngày 01/10/2018

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 ạ

Hung viết 17:57 ngày 01/10/2018

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.

Tao Không Ngu. viết 18:04 ngày 01/10/2018

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ả.

Nguyễn Dương viết 17:58 ngày 01/10/2018

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 cách làm của e nó chỉ đúng trong 1 vài trường hợp

Tao Không Ngu. viết 17:55 ngày 01/10/2018

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

Bài liên quan
0