Latar Belakang
Pohon tanpa label mungkin terlihat seperti ini:
o
/ | \
o o o
| / \
o o o
Untuk merender pohon ini, pertama-tama kita beri label pada setiap simpul o
dengan jumlah simpul turunannya:
3
/ | \
1 0 2
| / \
0 0 0
dan kemudian tulis angka-angka dalam daftar dengan cara yang menarik napas pertama, artinya baris demi baris dan kiri ke kanan:
[3, 1, 0, 2, 0, 0, 0]
Ini adalah representasi unik dan tidak ambigu dari pohon di atas, yang berarti bahwa tidak ada dua pohon murni yang berbeda akan memiliki linierisasi yang sama dan bahwa kita dapat merekonstruksi pohon asli dari daftar.
Meskipun setiap pohon sesuai dengan daftar bilangan bulat tertentu, tidak setiap daftar bilangan bulat mewakili pohon linier yang valid: Sebagai contoh [2, 0, 0, 0]
tidak mewakili pohon yang valid, jika kita mencoba untuk de-linierisasi itu kita berakhir dengan pohon ini
[2,0,0,0] -> 2 [0,0,0] -> 2 [0,0] -> 2 [0]
/ \ / \ / \
0 0 0
tetapi masih memiliki 0
kiri dalam daftar dan tidak ada tempat untuk meletakkannya. Demikian pula [2, 0]
juga bukan linierisasi pohon yang valid, karena pohon de-linierisasi memiliki bercak anak kosong:
2
/ \
0
Tugas
Diberikan daftar integer, putuskan apakah itu linearisasi pohon yang valid menggunakan sesedikit mungkin byte. Anda dapat menulis program atau fungsi lengkap.
Input: Daftar bilangan bulat non-kosong yang tidak kosong.
Output: Nilai kebenaran jika daftar adalah linierisasi pohon, nilai palsu sebaliknya.
Testcases
Sejujurnya[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]
Falsy
[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@{+\(_{\}&}/|!}
Kupikir?