プリアンブルの後の非再帰的なバイナリツリートラバーサル

ご注文後、バイナリツリートラバーサルを達成するための再帰的な方法、それは簡単である前に、我々は唯一の機能スタックが自動的に私たちは、複雑な操作を実行するのに役立ちます、非常に単純な再帰的なステートメントを使用する必要があります。フロント後順トラバーサルバイナリツリーの非再帰的方法を使用して、本質的にシミュレーションヒト機能スタックにスタックを作成します。

1.前順トラバーサル非再帰的

  1. スタック・アプリケーション・スタック、スタックは、ヘッドノードに押し込まれます。

  2. (空でない)、スタック、印刷からその右の子ノードをスタックノードをポップはスタックに押し込まれ、(空でない場合)、最終的にはその左の子ノードにスタックに押し込まれます。

  3. スタックが空になるまでステップ2は、全体の処理を終了繰り返されます。

private static void firstSearch(TreeNode t){

        Stack<TreeNode> stack = new Stack<>();
        // 先放根,然后pop出来放右节点和左节点,然后重复上述操作
        stack.push(t);
        while(!stack.isEmpty()){
            TreeNode temp = stack.peek();
            stack.pop();
            System.out.println(temp.val);
            if(temp.right != null){
                stack.push(temp.right);
            }
            if(temp.left != null){
                stack.push(temp.left);
            }
        }
    }

非再帰的トラバーサルを達成するために2

  1. スタックスタックを適用し、最初の季節CUR =ヘッド

  2. 最初のスタックにプッシュCUR、左境界を順次スタックにプッシュされ、即ち、T = t.leftを作るために維持、繰り返しは2ステップ

  3. まで繰り返さ2はヌル、スタックからポップノード、ノードと呼ばれる、プリントのノード値、およびt = node.right、反復ステップせている2

  4. スタックが空であり、tが空になると、プロセスが停止します。


private static void midSearch(TreeNode t){
        Stack<TreeNode> stack = new Stack<>();
        // 首先不断入栈顶节点的左节点,直到入不了为止,然后pop出栈顶节点,入一个右节点,然后入该右节点的左子节点直到
        // 入不了为止,重复上述步骤
        if(t != null){
            while(t != null || !stack.isEmpty()){
                if(t != null){
                    stack.push(t);
                    t = t.left;
                }else{
                    System.out.println(stack.peek().val);
                    t = stack.pop().right;
                }
            }
        }
    }

3.非再帰後順

  1. スタックS1、S1のスタックに、次にヘッドノードを適用します。

  2. その後、ポップ-S1一時、一時として記録ノードから左の子ノードと押し込ま右の子ノードS1をオンにします。

  3. プロセスを通じて、各ノードはS1から排出され、S2が置かれています。

  4. s1が空になるまで、ステップ2および3を繰り返して、プロセスが停止します。

  5. 順次プリントノードとS2から吐出され、注文後の印刷順序が横断しています。


private static void lastSearch(TreeNode t){
        // 仿照先序遍历的相反顺序,但是pop出来后需要放入另一个栈中
        Stack<TreeNode> stack1 = new Stack<>();
        Stack<TreeNode> stack2 = new Stack<>();
        stack1.push(t);
        while(!stack1.isEmpty()){
            TreeNode temp = stack1.peek();
            stack2.push(stack1.pop());
            if(temp.left != null){
                stack1.push(temp.left);
            }
            if(temp.right != null){
                stack1.push(temp.right);
            }
        }
        while(!stack2.isEmpty()){
            System.out.println(stack2.pop().val);
        }
    }

おすすめ

転載: www.cnblogs.com/Water2Wine/p/12580860.html