前順トラバーサル順序と順序トラバーサル順序は、バイナリツリーによって決定方法は??
- 最後に、ルートノードは、配列先行予約に応じて決定されます。
- ルートシーケンスの先行予約に応じて二つのサブシーケンスに左右分割しました。
- 同じ再帰的方法を使用して、それぞれ左サブツリー及び右サブツリーの分解を継続します。
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 - == 0) 40 リターン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 }