一次再帰的を達成バイナリ、シーケンスは、シンプルかつ後順横断です。
問題解決の方法は、非再帰的な再帰的手法を用いて実現することができます。スタックは、アプリケーションのスタックデータ構造も同じ機能を実現できるかどうか関数の代わりに、情報を格納するための再帰関数を使用することです。
先行順走査(LeetCode144)による非再帰的な方法を実現するためのバイナリツリー:
図1に示すように、アプリケーション・スタックのスタックとスタックは、ヘッドノードに押し込まれます。
図2に示すように、スタックの最上部は、スタック内に押し込まれ、最終的にはその左の子ノード(空でない場合)には、スタックに押し込むこと(空ではない)スタックノード、プリント、およびその右の子ノードからポップされます。
スタックが空になるまで3は、ステップ2を繰り返し、全体の処理は終了します。
1 / ** 2 分木のノードのための*の定義。 3 *パブリッククラスツリーノード{ 4 * int型のval; 5 *のTreeNodeは左。 6 *のTreeNodeは正しいです。 7 *ツリーノード(INT X){ヴァル= X。} 8 *} 9 * / 10 インポート java.utilの*。; 11 クラスソリューション{ 12 公衆リスト<整数> preorderTraversal(ツリーノードのルート){ 13 一覧<整数>リスト= 新規のArrayList <整数> (); 14 スタック<のTreeNode>スタック=新しいスタック<のTreeNode> (); 15 であれば(!ルート= NULL ){ 16 stack.push(ルート)。 17 ながら(!stack.empty()){ 18 ツリーノードTR = stack.pop()。 19 list.add(tr.val)。 20 であれば(tr.right!= NULL ){ 21 stack.push(tr.right)。 22 } 23 であれば(tr.left!= NULL ){ 24 stack.push(tr.left)。 25 } 26 } 27 } 28 リターンリスト。 29 } 30 }
行きがけ(LeetCode94)による非再帰的な方法を実現するためのバイナリツリー:
1、スタックのスタックアプリケーション、初期季節CUR =ヘッド
図2に示すように、第一のスタックにプッシュCUR、左ボーダーが順次すなわちそうCUR = cur.leftを維持、スタックにプッシュされ、繰り返しが2ステップ
ヌルになるまで3、2は、スタックからポップノードを繰り返し、手順を繰り返し、ノード、印刷のノード値などCUR = node.rightと称される2
スタックが空であるとCURが空のとき4、プロセスが停止します。
1 / ** 2 分木のノードのための*の定義。 3 *パブリッククラスツリーノード{ 4 * int型のval; 5 *のTreeNodeは左。 6 *のTreeNodeは正しいです。 7 *ツリーノード(INT X){ヴァル= X。} 8 *} 9 * / 10 クラスソリューション{ 11 公衆リスト<整数> inorderTraversal(ツリーノードヘッド){ 12 一覧<整数>リスト= 新規のArrayList <整数> (); 13 スタック<ツリーノード>スタック= 新しいスタック<ツリーノード> (); 14 もし(!ヘッド= NULL ){ 15 ながら(ヘッド!= NULL ||!stack.empty()){ 16 であれば(ヘッド!= NULL ){ 17 stack.push(ヘッド) 18 ヘッド= head.left。 19 } 他{ 20 ヘッド= stack.pop()。 21 list.add(head.val)。 22 ヘッド= head.right。 23 } 24 } 25 } 26 リターンリスト。 27 } 28 }
非バイナリツリーを再帰的に後順(LeetCode145)で実装:
少し問題を非再帰的な方法を達成するために横断した後。
図1は、スタックS1、S1のスタックに、次に、ヘッドノードを適用します。
CUR左の子ノードと圧入S1の右の子ノードに続くノード表記のS1 CURから2、ポップアップ、。
図3は、プロセスにおいて、各ノードは、S1から排出され、S2が置かれています。
s1が空になるまで4、繰り返し2と3ステップ、プロセスが停止します。
図5に示すように、順次印刷ノード及びS2から吐出される、注文後の印刷順序が横断しています。
1 / ** 2 分木のノードのための*の定義。 3 *パブリッククラスツリーノード{ 4 * int型のval; 5 *のTreeNodeは左。 6 *のTreeNodeは正しいです。 7 *ツリーノード(INT X){ヴァル= X。} 8 *} 9 * / 10 クラスソリューション{ 11 公衆リスト<整数> postorderTraversal(ツリーノードヘッド){ 12 一覧<整数>リスト= 新規のArrayList <整数> (); 13 スタック<ツリーノード> stack1 = 新しいスタック<ツリーノード> (); 14 スタック<のTreeNode> stack2 = 新しいスタック<のTreeNode> (); 15 であれば(ヘッド!= NULL ){ 16 stack1.push(ヘッド) 17 ながら(!stack1.empty()){ 18 ヘッド= stack1.pop()。 19 stack2.push(ヘッド) 20 であれば(head.left!= NULL ){ 21 stack1.push(head.left)。 22 } 23 であれば(head.right!= NULL ){ 24 stack1.push(head.right)。 25 } 26 } 27 ながら(!stack2.empty()){ 28 list.add(stack2.pop()ヴァル。); 29 } 30 } 31 リターンリスト。 32 } 33 }
コメントを残すにようこそ!!