バイナリツリー全検索
問題の説明
バイナリツリーは、空であるか又はルートRと左右のサブツリーと呼ばれる2つの互いに素なバイナリツリーで構成された頂点の有限集合です。バイナリツリーの頂点が体系的に横断または注文することができる最も重要な3つの方法があります。彼らは前順、INORDERおよび後順です。Tは、ルートRとサブツリーのT1、T2との二分木とします。
Tの頂点の先行順走査で、我々は、先行予約で、次に、先行順にT2の頂点をT1の頂点を訪問し、続いてルートrを訪れます。
Tの頂点のINORDERトラバーサルでは、我々は、INORDERにINORDERにおけるT2の頂点に続く、ルートrを、T1の頂点を訪れます。
Tの頂点の後順トラバーサルでは、我々は後順でT2の頂点、その後、後順にT1の頂点を訪問し、最終的に我々は、rをご覧ください。
今、あなたは特定のバイナリツリーの前のシーケンスとINORDERシーケンスを与えられています。その後順のシーケンスを見つけるために試してみてください。
Tの頂点の先行順走査で、我々は、先行予約で、次に、先行順にT2の頂点をT1の頂点を訪問し、続いてルートrを訪れます。
Tの頂点のINORDERトラバーサルでは、我々は、INORDERにINORDERにおけるT2の頂点に続く、ルートrを、T1の頂点を訪れます。
Tの頂点の後順トラバーサルでは、我々は後順でT2の頂点、その後、後順にT1の頂点を訪問し、最終的に我々は、rをご覧ください。
今、あなたは特定のバイナリツリーの前のシーケンスとINORDERシーケンスを与えられています。その後順のシーケンスを見つけるために試してみてください。
入力
入力は、いくつかのテストケースが含まれています。各テストケースの最初の行は、単一の整数nを含有する(1 <= N <= 1000)、二分木の頂点の数。それぞれプレオーダー配列およびINORDER順序を示す2本のラインが続きます。あなたは、彼らが常に排他的なバイナリツリーに対応していると仮定することができます。
出力
各テストケースについての対応する後順の配列を指定する単一の行を印刷します。
サンプル入力
9
9 1 2 4 7 3 5 8 9 6
4 7 2 1 8 9 5 3 6
サンプル出力
7 4 2 8 9 5 6 3 1
ECUSTのluoyongjun // の#include <ビット/ STDC ++ H.> 使用して名前空間STD; のconst int型N = 1010; INTプレ[N]、[N]で、POST [N]; //一次配列において、後 INT K; 構造体ノード{ int値、 ノードL *、* R&LT; ノード(int値= 0、ノード*のL = NULL、ノード* R&LT = NULL):値(値)、L(L)は、R(R&LT){ } }; //成果はBuildTree(int型のL、R&LT INT、INT&T、ルートノード*&){を無効 ;フラグ= -1をint型 (iは++ iはLを= int型の最初の第一の配列// ;; I <= R)を対応する位置を見つけるためにルート、 IF(IN [I] ==事前[T]){ ; BREAKフラグに= I } IF(フラグに== -1)のリターン; //エンド ルート=新しいノードを(で[フラグ]); //新しいノード T ++。 BuildTree(FLAG> Lで)IF(フラグにL、 - 1、T、ルート- > L。); IF(フラグに<R&LT)BuildTree(フラグ+ 1においては、R、T、ルート- > R&LT。); } ボイドプレオーダー(ノード*ルート){//配列の先行予約を見つける (ルート= NULL){IF! POST [K ++] =ルート- >値; //出力 プレオーダー(ルート- > L); (ルートプレオーダー- > R&LT); } } ボイド順序どおり(ノード*ルート){//モチーフ配列を見出す IF(ルート= NULL!){ INORDER(ルート- > L); POST [K ++] =ルート- >値; //出力 INORDER(ルート- > R&LT); } } ボイド後順(ノード*ルート){//配列の後に配列を見つける (ルート= NULL!){IF 後順(ルート- > L)、 後順(ルート- > R&LT)。 ポスト[K ++] =ルート- >値。//输出 } } ボイドremove_tree(ノード*ルート){//释放空间 場合(ルート== NULL)のリターン; remove_tree(root-> L)。 remove_tree(root-> R) ルートを削除します。 } メインINT(){ int型のn; (〜のscanf( "%d個"、&N)){一方 のscanf( "%dの"、およびプレ[i])とするための(; iが<= N I ++は、I = 1 INT)。 (INT J = 1; J <= N; J ++)のためのscanf( "%dの"、&[J]で)。 ノード*ルート。 int型、T = 1; buildtree(1、N、T、根); K = 0。//记录结点个数 後順(ルート)。 (I 0 = int型、I <K; iは++)のためのprintf( "%d個の%のC"、ポスト[i]は、I == K-1 '\ N'?」「)。 remove_tree(ルート)。 } 0を返します。 }