非バイナリ再帰的な一次、シーケンス、および後順トラバーサル

一次再帰的を達成バイナリ、シーケンスは、シンプルかつ後順横断です。

問題解決の方法は、非再帰的な再帰的手法を用いて実現することができます。スタックは、アプリケーションのスタックデータ構造も同じ機能を実現できるかどうか関数の代わりに、情報を格納するための再帰関数を使用することです。

 

先行順走査(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 }

コメントを残すにようこそ!

 

おすすめ

転載: www.cnblogs.com/hengzhezou/p/11027190.html