バイナリツリー復興(シーケンス先行順走査が知られており、リア)

バイナリツリーの再構築:

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)。        
        } 
        戻り木。
} 

}

 













おすすめ

転載: www.cnblogs.com/songjinzhao/p/11440410.html