Vì vậy, trước khi bạn đọc một số khái niệm khoa học máy tính cơ bản.
- Cây nhị phân là một cấu trúc được phân bổ động (thường được sử dụng để lưu trữ theo thứ tự).
- Bởi vì bản chất của nó đi qua cây nhị phân thường là đệ quy;
Điều này là do truyền tải tuyến tính (thông qua một vòng lặp) không phải là tự nhiên khi có hai con đường lặp.- Đệ quy: Điều này có nghĩa là một hàm gọi chính nó.
- Trong các ngôn ngữ cũ, quản lý bộ nhớ yêu cầu quản lý bộ nhớ thủ công.
- Hướng dẫn sử dụng: Có nghĩa là bạn phải tự làm điều đó.
- Khi bạn thực hiện quản lý bộ nhớ thủ công, bạn cần thực tế yêu cầu hệ thống cơ bản giải phóng từng thành viên của cây.
- Miễn phí: khôi phục bộ nhớ trong các ổ đĩa toàn cầu để có thể sử dụng lại bộ nhớ và bạn không bị hết bộ nhớ.
- Giải phóng: điều này được thực hiện bằng cách gọi hàm
free()
và truyền cho nó con trỏ bạn muốn khôi phục. - Con trỏ: Nó giống như một cây gậy ảo. Cuối cùng là ký ức. Khi bạn yêu cầu bộ nhớ, bạn được cung cấp một con trỏ (thanh ảo) có bộ nhớ. Khi bạn hoàn thành, bạn trả lại con trỏ (thanh ảo).
Giải pháp đệ quy:
freeTree(Node* node)
{
freeTree(node->left);
freeTree(node->right);
free(node);
}
Vấn đề sau đó là đệ quy có nghĩa là bạn liên tục gọi hàm tương tự. Điều này phát triển ngăn xếp. Phát triển ngăn xếp sử dụng nhiều bộ nhớ hơn. Lý do bạn giải phóng cây là bạn muốn bộ nhớ trở lại sử dụng nhiều bộ nhớ hơn là phản tác dụng (ngay cả khi bạn lấy lại được cả hai bit của bộ nhớ).
Cuối cùng câu hỏi:
Vì vấn đề xoay quanh việc chuyển đổi phiên bản đệ quy ở trên thành một giải pháp tuyến tính (để bạn không phải sử dụng bộ nhớ).
Cho kiểu nút
typedef struct Node Node;
struct Node
{
Node* left;
Node* right;
};
Viết hàm để giải phóng một cây của các nút này.
Những hạn chế:
- Không thể sử dụng đệ quy (thậm chí không gián tiếp)
Không thể phân bổ bất kỳ không gian động để theo dõi.
Lưu ý có một giải pháp O (n)
Người chiến thắng:
- Phức tạp tốt nhất.
- Tie Break 1: Gửi lần đầu
- Tie Break 2: Số lượng nhân vật ít nhất.