ツリートラバーサルの概要
次のようにコンパイルされたバイナリツリートラバーサルの問題は、最近記録し、発生しました:
再帰:
再帰的な方法は、ので、それらを繰り返さない、比較的簡単です。コードは以下の通りであります:
前文:
パブリッククラスソリューション{
/ **
* @paramルート:バイナリツリーのルート。
* @return:ノードの値を含むArrayListの中に予約限定。
* /
公共のArrayList <Integer型>結果。
公共のArrayList <整数> preorderTraversal(ツリーノードのルート){
//ここにコードを書きます
(== nullのを引き起こす)場合
結果=新規のArrayList <整数>();
IF(ルート== NULL){
結果を返します。
}
(root.val)result.add。
preorderTraversal(root.left)。
preorderTraversal(root.right)。
結果を返します。
}
}
ためには:
パブリッククラスソリューション{
/ **
* @paramルート:バイナリツリーのルート。
* @return:ノードの値を含むArrayListの中INORDER。
* /
公共のArrayList <Integer型>結果。
公共のArrayList <整数> inorderTraversal(ツリーノードのルート){
//ここにコードを書きます
(== nullのを引き起こす)場合
結果=新規のArrayList <整数>();
IF(ルート== NULL){
結果を返します。
}
inorderTraversal(root.left)。
(root.val)result.add。
inorderTraversal(root.right)。
結果を返します。
}
}
シーケンス後:
パブリッククラスソリューション{
/ **
* @paramルート:バイナリツリーのルート。
* @return:ノードの値を含むArrayListの中に後順。
* /
公共のArrayList <Integer型>結果。
公共のArrayList <整数> postorderTraversal(ツリーノードのルート){
//ここにコードを書きます
(== nullのを引き起こす)場合
結果=新規のArrayList <整数>();
IF(ルート== NULL){
結果を返します。
}
postorderTraversal(root.left)。
postorderTraversal(root.right)。
(root.val)result.add。
結果を返します。
}
}
非再帰のために
前文
先行順走査のためのノードのスタックを保持するために、非再帰的トラバーサルの必要性、それは完全にアクセスした後、それが初めてであるアクセスに、しかし、さらなる処理のためのスタックにそれを置く必要性を、このノードに遭遇しました左と右のサブツリー。それは右の子、その後、別のポップスタックを持っていない場合は左に、スタックの先頭から要素を取る権利サブツリーを扱うそして、最後に行く ~~
パブリッククラスソリューション{
/ **
* @paramルート:バイナリツリーのルート。
* @return:ノードの値を含むArrayListの中に予約限定。
* /
公共のArrayList <整数> preorderTraversal(ツリーノードのルート){
//ここにコードを書きます
ArrayList <整数>結果=新規のArrayList <整数>();
IF(ルート== NULL){
結果を返します。
}
スタック<のTreeNode> S =新しいスタック<のTreeNode>();
しばらく(!s.empty()||ルート!= NULL){
しばらく(ルート!= NULL){
(root.val)result.add。
s.push(ルート)。
ルート= root.left。
}
(もし!s.empty()){
ルート= s.pop()。
ルート= root.right。
}
}
結果を返します。
}
}
ためには:
同じスタックプレオーダーのために保存していますが、スタックにアクセスしていないとき、しかしときスタックアクセスします。(トラバーサル順序は、スタックの順番から見て左のサブツリーを、アクセスするために必要なので、スタックは、サブツリーのルートの後に残される、それは最初のスタック出し入れする必要があり、最初の。素敵なアクセス)
パブリッククラスソリューション{
/ **
* @paramルート:バイナリツリーのルート。
* @return:ノードの値を含むArrayListの中INORDER。
* /
公共のArrayList <Integer型>結果。
公共のArrayList <整数> inorderTraversal(ツリーノードのルート){
//ここにコードを書きます
ArrayList <整数>結果=新規のArrayList <整数>();
IF(ルート== NULL){
結果を返します。
}
スタック<のTreeNode> S =新しいスタック<のTreeNode>();
しばらく(!s.empty()||ルート!= NULL){
しばらく(ルート!= NULL){
s.push(ルート)。
ルート= root.left。
}
(もし!s.empty()){
ルート= s.pop()。
(root.val)result.add。
ルート= root.right。
}
}
結果を返します。
}
}
シーケンス後:
後順は、より複雑な、スタック内のノードの前に、と事前にその右の子が訪れたか右の子が空の場合は、最後の訪問のノードの保存、スタックが必要があり、アクセスノード、および前ノード用に設定されたルート= nullを、(根は経由でアクセスされているので、その後、スタックの新しい要素が)、そうでない場合には、まず右のサブツリーにアクセスする必要があり、スタック内の次の要素へのスタックの代わりに、現在の要素を。
パブリッククラスソリューション{
/ **
* @paramルート:バイナリツリーのルート。
* @return:ノードの値を含むArrayListの中に後順。
* /
公共のArrayList <整数> postorderTraversal(ツリーノードのルート){
//ここにコードを書きます
ArrayList <整数>結果=新規のArrayList <整数>();
IF(ルート== NULL){
結果を返します。
}
スタック<のTreeNode> S =新しいスタック<のTreeNode>();
TreeNodeの前= NULL;
しばらく(!s.empty()||ルート!= NULL){
しばらく(ルート!= NULL){
s.push(ルート)。
ルート= root.left。
}
(もし!s.empty()){
ルート= s.peek()。
IF(事前== root.right || root.right == NULL){
ルート= s.pop()。
(root.val)result.add。
=ルートを事前。
ルート= NULL;
}
そうしないと{
ルート= root.right。
}
}
}
結果を返します。
}
}