Lý lịch
Một cây không ghi nhãn có thể trông như thế này:
o
/ | \
o o o
| / \
o o o
Để tuyến tính hóa cây này, trước tiên chúng ta gắn nhãn cho mỗi nút o
bằng số nút con của nó:
3
/ | \
1 0 2
| / \
0 0 0
và sau đó viết các số trong một danh sách theo cách dễ hiểu, nghĩa là từng dòng và từ trái sang phải:
[3, 1, 0, 2, 0, 0, 0]
Đây là một đại diện độc đáo và rõ ràng của cây ở trên, có nghĩa là không có hai cây thuần khác nhau sẽ có cùng tuyến tính hóa và chúng ta có thể xây dựng lại cây ban đầu từ danh sách.
Mặc dù mỗi cây tương ứng với một danh sách số nguyên nhất định, nhưng không phải mỗi danh sách số nguyên đại diện cho một cây được tuyến tính hóa hợp lệ: Ví dụ: [2, 0, 0, 0]
không đại diện cho một cây hợp lệ, nếu chúng ta cố gắng phi tuyến tính hóa, chúng ta sẽ kết thúc với cây này
[2,0,0,0] -> 2 [0,0,0] -> 2 [0,0] -> 2 [0]
/ \ / \ / \
0 0 0
nhưng vẫn còn một 0
danh sách trong danh sách và không có nơi nào để đặt nó. Tương tự như vậy [2, 0]
cũng không phải là một tuyến tính cây hợp lệ, vì cây phi tuyến tính có một điểm con trống:
2
/ \
0
Bài tập
Đưa ra một danh sách số nguyên, quyết định xem đó có phải là một tuyến tính hợp lệ của cây bằng cách sử dụng càng ít byte càng tốt hay không. Bạn có thể viết một chương trình đầy đủ hoặc một chức năng.
Dữ liệu vào: Danh sách các số nguyên không âm.
Đầu ra: Một giá trị trung thực nếu danh sách là tuyến tính hóa của cây, nếu không thì giá trị giả.
Tủ thử
Sự thật[0]
[2, 0, 0]
[1, 1, 1, 1, 1, 0]
[3, 1, 0, 2, 0, 0, 0]
[2, 0, 2, 2, 0, 0, 2, 0, 0]
[3, 2, 2, 1, 1, 1, 0, 0, 0, 0, 0]
[1, 5, 3, 0, 2, 1, 4, 0, 1, 0, 0, 2, 1, 0, 0, 1, 1, 0, 0, 0, 0, 2, 1, 0, 0, 1, 0]
Giả
[0, 1]
[2, 0]
[2, 0, 0, 0]
[1, 0, 1]
[3, 2, 1, 0]
[2, 0, 0, 2, 0, 0]
[4, 1, 0, 3, 0, 0, 0, 0]
[4, 2, 0, 3, 1, 0, 0, 0, 0, 0]
{X0@{+\(_{\}&}/|!}
Tôi nghĩ?