実施二つの機能をシリアライズとデシリアライズバイナリに使用されています
これは、バイナリの配列を指す:二分木はバイナリ永続メモリを設定することができるように、トラバース方法の結果に応じて、書式文字列で保存されています。バイナリツリートラバーサル順序が変更され、後のシリアル化が最初の順序に基づいてもよいし、順番に、結果のシーケンスは、シンボルへのいくつかの配列によって空白ノード(#)を表す文字列であります!エンド・ノードは、値(値を!)を表します。
非直列化バイナリツリー手段:直列化された文字列strのいくつかの結果は、バイナリツリーを再構築するトラバーサル順序を得ました。
方法A:配列として格納
/ * 関数ツリーノード(X){ X = this.val。 this.left = NULL; this.right = NULL; } * / constのARR = []; 機能のSerialize(PROOT){ // ここに書くコード であれば(PROOT === ヌル){ arr.push( '#' ); } 他{ arr.push(pRoot.val)。 シリアライズ(pRoot.left)。 シリアライズ(pRoot.right)。 } } 関数デシリアライズ(){ // ここで、書き込みコード せノード= NULL ; もし(arr.length <1 ){ 戻り ヌル。 } CONSTルート = arr.shift()。 もし(typeof演算ルート===「番号」){ ノードは = 新しいツリーノード(ルート)。 node.left = デシリアライズ()。 node.right = デシリアライズ()。 } 戻りノード。 }
方法2:#はヌルを示し、!分離された、実際には、増加ステップに相当アレイ工程に格納されている文字列にそれを有効にするであろう。
機能ツリーノード(X){ この .val = X。 この .LEFT = nullを。 この .RIGHT = nullを。 } 関数シリアライズ(R) { もし、(R === ヌル) リターン "#!" ; VaRの RES = "" ; VAR S = []; s.push(R) 一方、(!s.length == 0 ){ VAR CUR = s.pop()。 RES + =(CUR === nullの)?"#" + = "!":cur.val。 解像度; もし(!CUR == nullの){ s.push(cur.right)。 s.push(cur.left)。 } } 戻りRES。 } 関数デシリアライズ(S) { もし、(S === "" ) 戻り ヌル。 VAR ARR = s.split( "!" ); リターンステップ(ARR)。 } 関数工程(ARR){ VAR CUR = arr.shift()。 もし(CUR === "#" ) の戻り はnull ; VARノード=新しいのTreeNode(CUR)。 node.left = ステップ(ARR)。 node.right = ステップ(ARR)。 リターン・ノード; }