Ön sipariş + sipariş sonrası


11

Görev

Tam bir ikili ağacın sipariş öncesi ve sipariş sonrası geçişleri göz önüne alındığında, siparişteki geçişini döndürün.

Geçişler, her biri bir düğümü benzersiz şekilde tanımlayan n farklı pozitif tamsayı içeren iki liste olarak temsil edilecektir . Programınız bu listeleri alabilir ve ortaya çıkan sıralı geçişi makul herhangi bir I / O formatı kullanarak çıkarabilir.

Girişin geçerli olduğunu varsayabilirsiniz (yani, listeler aslında bir ağacın geçişlerini temsil eder).

Bu , bu nedenle bayttaki en kısa kod kazanır.

Tanımlar

Bir tam ikili ağaç sonlu yapıdır düğümler eşsiz pozitif tamsayılar tarafından burada temsil.

Tam ikili ağaç ya bir olan yaprak tek oluşan düğüm :

                                      1

Ya da her biri tam bir ikili ağaç olan iki alt ağaçtan ( sol ve sağ alt ağaç denir) bir düğümden oluşan bir dal :

                                      1
                                    /   \
                                  …       …

İşte tam bir ikili ağacın tam bir örneği:

                                        6
                                      /   \
                                    3       4
                                   / \     / \
                                  1   8   5   7
                                     / \
                                    2   9

Ön sipariş geçişi aşağıdaki gibi tam bir ikili ağacın yinelemeli tanımlanır:

  • N düğümü içeren bir yaprağın ön sıradan geçişi listedir [ n ].
  • N düğümü ve alt ağaçlar (L, R) içeren bir dalın ön siparişi çapraz geçişi , liste [ n ] +  ön sipariş ( L ) +  ön sipariş ( R ) 'dir; burada +, liste birleştirme operatörüdür.

Yukarıdaki ağaç için bu [6, 3, 1, 8, 2, 9, 4, 5, 7] .


Sonrası düzen geçişi aşağıdaki gibi tam bir ikili ağacın yinelemeli tanımlanır:

  • N düğümü içeren bir yaprağın sıradan geçişi listedir [ n ].
  • N düğümü ve alt ağaçlar (L, R) içeren bir dalın sipariş sonrası geçişi , liste postorder ( L ) +  postorder ( R ) + [ n ] 'dir.

Yukarıdaki ağaç için bu [1, 2, 9, 8, 3, 5, 7, 4, 6] .


İçinde sipariş geçişi aşağıdaki gibi tam bir ikili ağacın yinelemeli tanımlanır:

  • N düğümü içeren bir yaprağın sıralı olarak geçmesi liste [ n ] 'dir.
  • N düğümü ve alt ağaçlar (L, R) içeren bir dalın sıralı olarak geçişi , liste sırası ( L ) + [ n ] +  sırası ( R ) ' dır .

Yukarıdaki ağaç için bu [1, 3, 2, 8, 9, 6, 5, 4, 7] .


Sonuç olarak: [6, 3, 1, 8, 2, 9, 4, 5, 7] (ön) ve [1, 2, 9, 8, 3, 5, 7, 4, 6] çift ​​çifti göz önüne alındığında (post) giriş olarak programınız [1, 3, 2, 8, 9, 6, 5, 4, 7] çıktısını almalıdır .

Test senaryoları

Her test durumu formattadır preorder, postorder → expected output.

[8], [8] → [8]
[3,4,5], [4,5,3] → [4,3,5]
[1,2,9,8,3], [9,8,2,3,1] → [9,2,8,1,3]
[7,8,10,11,12,2,3,4,5], [11,12,10,2,8,4,5,3,7] → [11,10,12,8,2,7,4,3,5]
[1,2,3,4,5,6,7,8,9], [5,6,4,7,3,8,2,9,1] → [5,4,6,3,7,2,8,1,9]

Girişin belirli bir şekle (tam bir ikili ağaç) sahip olması garanti edildiğinden, her iki girişe de gerçekten ihtiyacınız yoktur, değil mi?
feersum

İkili ağaç tam değil, tam bir nedenle, n genel olarak her iki ihtiyacın var, -eleman ağaç birçok şekiller olabilir ve.
Lynn

Düğümleri emirler için ipler vererek tek harf olarak gösterebilir miyim. İkinci örnek olacak Ör: "CDE" and "DEC" give "DCE"? (çok sayıda düğüme ihtiyacım olursa unicode harfleri bile kullanıyor)
Ton Hospel

@TonHospel Bununla iyi olurum - tartışmasız, yaptığınız tek şey bir tamsayı listesi tanımını biraz uzatmaktır , çünkü :) ' "CDE"dan çok farklı değil [67, 68, 69]:)
Lynn

Yanıtlar:


2

Perl, 69 66 62 56 53 bayt

İçin +1 içerir -p

Posttorder ve ardından ön siparişi STDIN üzerindeki boşlukla ayrılmış bir satır olarak alır (öncesi ve sonrası sırasına dikkat edin). Düğümler benzersiz harfler olarak gösterilir (boşluk veya yeni satır olmayan herhangi bir karakter TAMAM).

inpost.pl <<< "98231 12983"

inpost.pl:

#!/usr/bin/perl -p
s%(.)(.)+\K(.)(.+)\3(\1.*)\2%$4$5$3$2%&&redo;s;.+ ;;

Orijinal tamamen sayısal formatı kullanmak, tek bir sayıyı tam olarak tanımlamak için çok daha fazla dikkat gerektirir ve 73 baytta gelir

#!/usr/bin/perl -p
s%\b(\d+)(,\d+)+\K,(\d+\b)(.+)\b\3,(\1\b.*)\2\b%$4$5,$3$2%&&redo;s;.+ ;;

Farklı kullan

inpostnum.pl <<< "11,12,10,2,8,4,5,3,7 7,8,10,11,12,2,3,4,5"

-p;sonuna a ekler , böylece sonuncuya ihtiyacınız yoktur ;. s;.* ;;->s;.* ;
Riley

@Riley biliyorum. Bu yüzden ;sonunda var. Ancak -p aslında \n;bir -eprogramın sonuna ekler . Bir dosyaya sadece ;ve sadece dosya bitmezse ekler \n. -p+3 olarak değil +1 olarak talep etmek istediğimden , programın komut satırından çalışması gerekiyor -e. Ve sonra alacağım çıkışta sahte yeni satır istemiyorum
Ton Hospel

Eğer komut satırında çalıştırırsanız, 'etrafında değil mi? Eğer sahip olduğunuz şekilde çalıştırırsanız (ile dosya çağırın <<<) sonuncusunu bırakabilirsiniz ;.
Riley

@Riley Perl için puanlama yönteminin yorumlanmasına bağlıdır. Daha az geçici olduğunu düşündüğüm için genellikle kodumu dosya olarak gönderirim. Ancak gönderimlerime bakarsanız, kodun bir dosyada olması gerekiyorsa (örneğin, sahip olduğu 'veya kullandığı do$0vb.) Her zaman -p+3 (boşluk, eksi, p) olarak puan aldığımı , ancak kodun da işe yarayacağını göreceksiniz. Aldığınız komut -e'+1e
satırında

Tamam, komut satırı gönderimlerinin tam olarak nasıl puan verdiğinden emin değildim. 'Ücretsiz olduğunu fark etmedim . Temizlediğin için teşekkürler.
Riley

3

Haskell, 84 83 bayt

(a:b:c)#z|i<-1+length(fst$span(/=b)z),h<- \f->f i(b:c)#f i z=h take++a:h drop
a#_=a

2

JavaScript (ES6), 100 bayt

f=(s,t,l=t.search(s[1]))=>s[1]?f(s.slice(1,++l+1),t.slice(0,l))+s[0]+f(s.slice(l+1),t.slice(l)):s[0]

G / Ç "güvenli" karakter dizilerindedir (örn. Harfler veya rakamlar). Alternatif yaklaşım, ayrıca 100 bayt:

f=(s,t,a=0,b=0,c=s.length-1,l=t.search(s[a+1])-b)=>c?f(s,t,a+1,b,l)+s[a]+f(s,t,l+2+a,l+1,c-l-2):s[a]
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.