これは、バイナリシーケンスと後順シーケンスの前順によって決定されます

前順トラバーサル順序と順序トラバーサル順序は、バイナリツリーによって決定方法は?

  • 最後に、ルートノードは、配列先行予約に応じて決定されます。
  • ルートシーケンスの先行予約に応じて二つのサブシーケンスに左右分割しました。
  • 同じ再帰的方法を使用して、それぞれ左サブツリー及び右サブツリーの分解を継続します。
  1の#include <stdio.hの>
   2の#include <STDLIB.H>
   3の#include < 文字列・H>
   4。  
  5。 構造体ノード
   6。 {
   7。     CHAR データ;
   8      構造体ノードLT *、* RT;
   9  };
 10  
。11  // 第二分木配列及び配列モチーフ配列
12は、 構造体ノード* create_by_pre_and_mid(INT N-、CHAR *プリ、CHAR * MID)
 13である {
 14      構造体 *ノード根;
 15      INT私;
16  
17      であれば(N == 0 18          リターンNULL。
19  
20      ルート=(構造体ノード*)はmallocはsizeof構造体ノード))。
21      root->データ=事前[ 0 ]。
22  
23      のために(私は= 0 ; I <N I ++)// 寻找左右子树的元素
24          であれば(PRE [ 0 ] == 中間[I])
 25              ブレーク26  
27      root-> LT = create_by_pre_and_mid(I、事前+ 1、MID)。// ビルド左サブツリーは
28      ディレクトリroot-> RT = create_by_pre_and_mid(Ni基1、+ I +を事前1。、MIDは、+ I + 1); // 右の部分木構築
29  
30      戻り、ルート
 31である }
 32  
33である // 後続のシーケンスによってのおよびモチーフ配列二分木
34である 構造体 create_by_post_and_mid(*ノードINT N-、CHAR * POST、CHAR * MID)
 35  {
 36      構造体ノード* ルート;
 37 [      INT I、
 38は 
39      IF(N - == 040          リターンNULL;
 41は 
42であり、      ルート=(構造体ノード*)はmallocはsizeof構造体ノード));
 43である      ディレクトリroot->データ= POST [N- 1 ];
 44は 
45      のために(私は= 0 ; I <N-; I ++)//は、要素の左と右のサブツリーを見つける
46で         IF(POST [N- 1 ] == MID [I])
 47              BREAK ;
 48  
49      ディレクトリroot-> LT = create_by_post_and_mid(I、POST、MID); // ビルド左サブツリー
50      root-> RT = create_by_post_and_mid(NI-。1、POST + I、+ I + MID 1。); // 右サブツリービルド
51である 
52である     戻りルートを、
 53である }
 54が  
55  // 予約購入後
56である ボイド後順(構造体ノード* ルート)
 57である {
 58      IF (ルート)
 59      {
 60          後順(ディレクトリroot-> LT);
 61である          後順(ディレクトリroot-> ; RT)
 62である          のprintf(" %のC "、ディレクトリroot-> ;データ)
 63である     }
 64  }
65  
66  // 順序トラバーサル
67  空隙プレオーダー(構造体ノード* ルート)
 68  {
 69      IF (ルート)
 70      {
 71である          (printfの" %のC "、ディレクトリroot-> データ);       
 72          プレオーダー(ディレクトリroot-> LT)
 73が          プレオーダー(ディレクトリroot-> RT);
 74      }
 75  }
 76  
77  // プレオーダー
78  空隙 midorder(構造体ノード* ルート)
 79  {
80      であれば(ルート)
 81      {
 82          midorder(root-> LT)。
83          のprintf(" %のC "、root-> データ)。          
84          midorder(root-> RT)。
85      }
 86  }
 87  
88  
89  INTメイン(ボイド90  {
 91      構造体ノード*ルート= NULL;
92      intがlenは、
93      のchar *ポスト= " DFEBGIHCA " 94     char *事前= " ABDEFCGHI " 95      のchar *半ば= " DBFEAGCHI " 96  
97      LEN = STRLEN(POST)。
98  
99      // ルート= create_by_pre_and_mid(LEN、中間、PRE)。
100      ルート= create_by_post_and_mid(LEN、ポスト、MID)。
101  
102      のprintf(" \ R \ npreorder:\ R \ n " );
103      プレオーダー(ルート)。
104  
105      のprintf(" \ R \ nmidorder:\ R \ n " );
106      midorder(ルート)。
107  
108      のprintf(" \ R \ npostorder:\ R \ n " );
109      後順(ルート)。
110  
111      のprintf(" \ R \ n " );
112  
113  
114      システム(" 一時停止" )。
115      リターン 0 ;
116 }

 

おすすめ

転載: www.cnblogs.com/utank/p/12048345.html