事前注文+注文から注文へ


11

仕事

完全な二分木の先行順および後順トラバーサルが与えられると、その順トラバーサルを返します。

トラバーサルは、それぞれがノードを一意に識別するn個の正の整数を含む2つのリストとして表されます。プログラムはこれらのリストを取得し、適切なI / O形式を使用して、結果の順序トラバーサルを出力します。

入力が有効であると仮定することができます(つまり、リストは実際にはツリーのトラバーサルを表します)。

これはであるため、バイト単位の最短コードが優先されます。

定義

完全なバイナリツリーは、有限構造であるノードのユニークな正の整数で、ここで示され、。

完全な二分木は、単一のノードで構成されるリーフのいずれかです。

                                      1

または、2つのサブツリーおよび右サブツリーと呼ばれる)を持つ1つのノードで構成されるブランチ。各サブツリーは完全な二分木です。

                                      1
                                    /   \
                                  …       …

完全なバイナリツリーの完全な例を次に示します。

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

完全なバイナリツリーの事前順序走査は、次のように再帰的に定義されます。

  • ノードnを含むリーフの事前順序走査はリスト[ n ]です。
  • ノードnとサブツリー(L、R)を含むブランチの事前順序走査は、リスト[ n ] +  事前順序L)+  事前順序R)です。ここで、+はリスト連結演算子です。

上記のツリーの場合、それは[6、3、1、8、2、9、4、5、7]です。


完全な二分木の後順走査は、次のように再帰的に定義されます。

  • ノードnを含むリーフのポストオーダートラバーサルはリスト[ n ]です。
  • 後順トラバーサルブランチノードを含むN個のサブツリー(L、R)がリストである後順L)+  後順R)+ [ N ]。

上記のツリーの場合、それは[1、2、9、8、3、5、7、4、6]です。


インオーダートラバース次のように完全なバイナリツリーの再帰的に定義されます。

  • ノードnを含むリーフの順序走査は、リスト[ n ]です。
  • ノードnとサブツリー(L、R)を含むブランチの順序走査は、リストの順序L)+ [ n ] +  順序R)です。

上記のツリーの場合、それは[1、3、2、8、9、6、5、4、7]です。


結論:リストのペア[ 6、3、1、8、2、9、4、5、7 ](前)と[1、2、9、8、3、5、7、4、6](post)入力として、プログラムは[ 1、3、2、8、9、6、5、4、7 ]を出力する必要があります。

テストケース

各テストケースの形式はです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]

入力は特定の形状(完全なバイナリツリー)を持つことが保証されているため、実際には両方の入力は必要ありませんか?
feersum

バイナリツリーはいっぱいですが、完全ではないため、n要素ツリーは多くの形状を持つことができ、一般に両方が必要です。
リン

ノードを注文用の文字列を与える単一の文字として表すことができます。たとえば、2番目の例は次のようになります"CDE" and "DEC" give "DCE"。(多くのノードが必要な場合でもユニコード文字を使用)
トンホスペル

間違いなく、あなたがやっているすべては、の定義ストレッチである-それはで@TonHospel私は大丈夫だろう整数のリストを少しので、"CDE"非常に異なっていない[67, 68, 69]:)
リン・

回答:


2

Perl、69 66 62 56 53バイト

+1を含む -p

STDINでスペースで区切られた1行として、postorderの後にpreorderが続きます(preとpostの順序に注意してください)。ノードは一意の文字として表されます(スペースでも改行でもない文字であれば問題ありません)。

inpost.pl <<< "98231 12983"

inpost.pl

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

元の純粋な数値形式を使用する場合、単一の数値を正確に識別するためにより多くの注意が必要であり、73バイトになります

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

使用

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

-p;最後にa を追加するため、最後のを必要としません;s;.* ;;->s;.* ;
ライリー

@Riley知っています。それが私が;最後にいる理由です。ただし、-pは実際にはプログラム\n;の最後に追加され-eます。ファイルでは;、ファイルがで終わらない場合にのみ追加し\nます。-p+3ではなく+1と主張したいので、プログラムはコマンドラインから動作する必要があります-e。そして、私は出力にスプリアス改行をしたくない私はその後になるだろう
トンHospel

コマンドラインで実行する場合、必要ありません'か?持っている方法で実行する場合(でファイルを呼び出す<<<)、最後のものを残すことができます;
ライリー

@Riley perlのスコアリング方法の解釈に依存します。一時的ではないと思うので、通常、コードをファイルとして送信します。あなたが私の提出を見れば、コードは次の場合しかし、あなたはそれを見ることができます必要があります(それが持っている例えばので、ファイル内にあること'や用途do$0など)私は常に得点-p+3(スペース、マイナス、P)として、コード希望も仕事であればあなたが得るコマンドライン上-e'自由のために私はとしてそれを得点+1にはにバンドルさせることができるのでe
トンHospel

さて、コマンドラインのサブミットの正確なスコアは明確ではありませんでした。私はあなたが'無料で手に入るとは知りませんでした。それを片付けてくれてありがとう。
ライリー

3

Haskell、84 83バイト

(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バイト

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]

I / Oは、「安全な」文字の文字列(文字や数字など)です。代替アプローチ、100バイト:

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]
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.