ツリーをトラバースJava実装

ツリートラバーサルの概要

次のようにコンパイルされたバイナリツリートラバーサルの問題は、最近記録し、発生しました:

再帰:

再帰的な方法は、ので、それらを繰り返さない、比較的簡単です。コードは以下の通りであります:

前文

パブリッククラスソリューション{

    / **

     * @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。

                }

            }

        }

        結果を返します。

    }

}

公開された47元の記事 ウォンの賞賛8 ビュー30000 +

おすすめ

転載: blog.csdn.net/nanchengyu/article/details/54098117