バイナリツリーの再構築:
1.一般的なトピックは、かつてのセット(順序トラバーサル以降)でトラバーサルを注文行きがけので、あなたは、バイナリ出力に別のトラバーサルを再構築します。あなたがいない復興プレオーダー場合は、バイナリツリーを与えることはできません。
ここでは、注文トラバーサル順序に求めた後、簡単な既知のプリアンブルを知ることができます。
まず、いくつかのバイナリツリートラバーサル機能を知っている必要があります:
1.フロントバイナリツリーをトラバース:まず、バイナリツリーのルートノードトラバーサルが、その後、左のサブツリーをトラバースし、右部分木をトラバース。
[最初のトラバース左サブツリー、その後、ルートノード、および右のサブツリーをトラバース:バイナリツリーをトラバース2.。
まずトラバース左サブツリー、右部分木、そして最終的にルートノードを:バイナリツリーを横断した後、3。
与えられる。所定のシーケンスの前順走査で、第1データは、ルートノードです。
2.与えられた配列プレオーダー、先行予約前のルートノードは、次に、シーケンス先行予約は、2つの部分、ルートノードの最初の部分、全体の二分木の左の部分木、半分にこのノードに応じて、決定される見つけますそれは右のサブツリー全体のバイナリツリーの一部です。
コード:
// 二叉树节点定义クラスツリーノード{ ツリーノードは、左、 右のTreeNode; int型の値。 公共のTreeNode(int型の値){ この .VALUE = 値。 }
公共のTreeNode(){
}
}
// プリアンブルシーケンス法的に示す配列かどうかを決定する無効まずフィルタ、 公共のTreeNode reBinaryTree(ツリーノード[]プレオーダー、ツリーノード[] INORDER){ // か有効系列長決定 INT preLen = preOrder.length; INT inLen = INORDER .LENGTH; IF(preLen == 0 || inLen == 0 ){ 戻り NULL ; } リターン ctBinaryTree(プレオーダー、順序どおり、0、1,0-preLen、-inLen 1。); }
// この方法は、次いで、二分木構造の再帰的二分木構造呼び出し 公開ツリーノードctBinaryTree(ツリーノード[]プレオーダー、ツリーノード[] INORDER、INT PRESTART、INT PREEND、INT inStart、INT inEnd){ // 前に応じてノードの配列先行順走査バイナリツリーのルートを構築するために(ルート)。 ツリー=ツリーノード新しい新しいツリー(プレオーダー[PRESTART]); // 、次に左右のサブツリーの長さを分割するルートノードで見つかった予約購入からは、 int型ルート= 0 ; のための(、ルート<inEnd; =ルートinStartルート++ ){ IF(プレオーダー[ PRESTART] == INORDER [ルート]){ BREAK ; } int型 leftLen =ルート-inStart; int型 rightLen = inEnd - ルート。 // 递归构造二叉树 場合(leftLen> 0 ){ tree.left = ctBinartTree(プレオーダー、順序どおり、事前開始+ 1、事前開始+ leftLen、inStart、ルート-1 )。 } であれば(rightLen> 0 ){ tree.right = ctBinaryTree(プレオーダー、順序どおり、事前開始+ 1 + leftLen、ルート+ 1 、inEnd)。 } 戻り木。 } }