A. 問題の説明
トラバースバイナリツリーは、ツリー行きがけ順に従って構成されています。
注意:
あなたは木が要素と重複しないと仮定することができます。
例えば、与えられました
プレオーダーINORDER = [9,3,15,20,7]
後順後順= [9,15,7,20,3]
以下のバイナリツリーを返します。
3
/ \
9 20
/ \
15 7
II。問題解決のためのアイデア
このトピックやアイデア:配列の使用と帰りがけ順を解決するために備えて、105個の質問はほとんど同じですし、最終順位は、この差はありません、ルートに変更する必要があります後の最初の順序は、ルートノードでなければなりません直前ハンは、具体的には、第1の105のタイトルを見て、言いました。
III。結果
実行時:21ミリ秒は、Javaの提出内のすべてのユーザーの37.40パーセントを打ちます
メモリ消費量:51.4メガバイトには、Javaの提出内のすべてのユーザーの8.79パーセントを打ちます
IV。Javaコード
クラスソリューション{ 公共のTreeNode buildTree(INT [] INORDER、INT []後順){ 場合(postorder.length> 0 ){ ツリーノードのルート = 新しいツリーノード(後順[postorder.length-1 ])。 一覧 <整数>オーダー= 新しいのArrayList <Integer型> (); 以下のために(INT I 0 =; I <inorder.length; I ++ ){ order.add(INORDER [I])。 } getTree(後順、postorder.length -1 、順序、根); リターンルート; } 他{ 戻り ヌル。 } } 公共 ボイド getTree(INT []後順、INT番号、一覧<整数> 順序、ツリーノードのルート){ 場合(order.size()== 1 ){ リターン。 } INT ordernum = order.indexOf(後順[数])。 もし(ordernum> 0 ){ リスト <整数> leftOrder = 新規のArrayList <整数>(order.subList(0 、ordernum))。 以下のための(INT iは数= 1; I> = 0; i-- ) { 場合(leftOrder.contains(後順[I])){ root.left = 新しいツリーノード(後順[I])。 getTree(後順、I、leftOrder、root.left)。 休憩; } } } もし(ordernum <order.size() - 1 ) { リスト <整数> rightOrder = 新規のArrayList <整数>(order.subList(ordernum + 1 、order.size()))。 用(INT J =番号-1; J> = 0; j-- ){ もし(rightOrder.contains(後順[J])){ root.right = 新しいツリーノード(後順[J])。 getTree(後順、J、rightOrder、root.right)。 休憩; } } } } }