バイナリツリートラバーサル結果DFS(NULLが示さ*)指定された、再構成されたバイナリは、ヘッドノードを返します。
アイデア:最初の*のNULLに、また、ツリーに挿入する*第一、第二の時間を渡します。
*あなたが直接レコードにNULLである場合は、再度ノードは知りません、最後に* NULLが割り当てられ、または独自のNULLが付属しています。
1つの#include <ビット/ STDC ++ H> 2 使用して 名前空間STDを、 3 4 構造体のTreeNode { 5 チャーヴァル; 6 のTreeNode * 左; 7 のTreeNode * 右; 8 ツリーノード(チャーNVAL){ 9 ヴァル= NVAL。 10は =左NULLと、 11 右= NULL; 12 } 13 }。 14 15のTreeNode *コンストラクト(文字列strの){ 16 もし(str.empty())戻りNULL。 17 18 スタック<ツリーノード*> TEMP。 19 ツリーノード*ルート= 新しいツリーノード(STR [ 0 ])。 20 temp.push(ルート)。 21 22 のために(int型 iは= 1 ; iは<str.sizeを(); iは++ ){ 23 であれば(STR [I]> = ' ' && STR [I] <= ' Z ' ){ 24 のTreeNode * newNode = 新しいですツリーノード(STR [I])。 25 一方(temp.top() - >)は(&& temp.topを左- > 右)temp.pop(); 26 27 であれば(temp.top() - >左== NULL)temp.top() - > =左newNode。 28 他の 場合(temp.top() - >右== NULL){ 29 temp.top() - >右= newNode。 30 } 31 temp.push(newNode)。 32 } 33 そう であれば(STR [I] == ' * ' ){ 34 のTreeNode * newNode = 新しいツリーノード(STR [I])。 35 であれば(temp.top() - >左== NULL)temp.top() - > =左newNode; 36 他の 場合(temp.top() - >右== NULL){ 37 temp.top() - >右= newNode。 38 temp.pop()。 39 } 40 } 41 42 } 43 44 // 按层遍历、将*改为NULL 45 キュー<ツリーノード*> QUE。 46 のTreeNode * CUR = NULL; 47 que.push(ルート)。 48 ながら(!que.empty()){ 49 のintサイズ= que.size()。 50 しばらく(size-- ){ 51 CUR = que.front()。 52 que.pop()。 53 であれば(cur->左&& cur->左>ヴァル== ' * ' ){ 54 cur->左= NULL; 55 } 56 であれば(cur->左&& cur->左>ヴァル=!' * ' ){ 57 que.push(cur-> 左)。 58 } 59 60 もし(cur->右&& cur->右>ヴァル== ' * ' cur->右= NULL; 62 } 63 であれば(cur->右&& cur->右>ヴァル=!' * ' ){ 64 que.push(cur-> 右)。 65 } 66 } 67 } 68 69 リターンルート。 70 71 } 72 73 空隙検索(ツリーノード*根、文字列&RES){ 74 であれば(ルート== NULL){ 75の RES + = ' * '; 76 リターン; 77 } 78 // RES + = root->ヴァル。 79 検索(root-> 左、RES)。 80の RES + = root-> ヴァル。 81 検索(root-> 右、RES)。 82 } 83 84 85 INT メイン(){ 86 // 文字列str = "abdm *** N ** EW ** CF ** G **"。 87 文字列str = " abが* GF ***のC *デ** ** fを" 。 88 のTreeNode *ルート= 構築物(STR); 89 90 文字列 アウト ="" ; 91 検索(ルート、アウト)。 92 93 coutの<< アウト << てendl; 94 95 }