答え「安全プランを証明」、Javaのための分析とノートは
「プランを勝ち取る」6刻まれている:バイナリツリーの再構築(プリアンブルシーケンスからとバイナリツリーの順序は、バイナリツリーを再構築するために)
本方法は:私たちは、バイナリツリーを再構築したい、我々はルートと左の子ノードとルートノードの右の子を見つけるために続けなければなりません。ことに留意されたいプリアンブルシーケンスは、その最初の要素は、バイナリ要素がトラバースし、その左部分木の右の部分木の前順走査をプレオーダーバックに、ルートノードです。質問は今、プリアンブルシーケンスだけであれば、我々は唯一のルートを見つけることができますが、ある我々は二つのサブ配列の長さは知らない、私たちはサブツリーのルートと同じ方法を見つけるために続けることができなくなります。我々が必要このとき補助配列 - 配列順序は、我々は2つの配列の長さを決定することができるように、その特性に応じて、ルートノードは、配列の左右配列の中央になければなりません。
public TreeNode build(int[] a, int[] b){
if(a.length == 0){
return null;
}
return build(a, 0, a.length-1, b, 0, b.length-1);
}
private TreeNode build(int[] a, int aStart, int aEnd, int[] b, int bStart, int bEnd){
if(aStart > aEnd)return null;
//构建根节点
TreeNode root = new TreeNode(a[aStart]);
//找到根节点在中序序列中的位置
int partition = bStart;
for(int i=bStart; i<=bEnd; i++){
if(b[i] == a[aStart]){
partition = i;
break;
}
}
//在左子序列中继续构建根节点
root.left = build(a, aStart+1, aStart+1+partition-1-bStart,
b, bStart, partition-1);
//在右子序列中继续构建根节点
root.right = build(a, aStart+partition-bStart+1, aEnd,
b, partition+1, bEnd);
//返回构建好的根节点
return root;
}
注:シーケンスの前と後の最初のシーケンスの最後の要素の後にシーケンスが常に配列を決定していないためにのみプリアンブルシーケンス+ +またはバイナリシーケンスの後続の再構成に使用される、プリアンブル・シーケンス+再構成された二分木は、一意ではありません最後にそれはまだ表現のサブツリー右部分木のフロント要素を残しています。例えば、<-2 <1、及び1-> 2-バイナリだけ右サブツリー> 3だけ左サブツリーバイナリ3、それらの配列とプリアンブルシーケンスは同じです。