非递归实现DFS

发布时间 2023-07-10 11:45:40作者: rockdow
import java.util.ArrayDeque;

public class NonRecuDfs {
    public static ArrayDeque<TreeNode> preArr = new ArrayDeque<>();
    public static ArrayDeque<TreeNode> inArr = new ArrayDeque<>();
    public static ArrayDeque<TreeNode> afterArr = new ArrayDeque<>();

    public static void preOrder(TreeNode root){
        while(!preArr.isEmpty() || root!=null){
            if(root!=null){
                System.out.print(root.val+" ");
                preArr.push(root);
                root = root.left;
            }else{
                TreeNode t = preArr.pop();
                root = t.right;
            }
        }
    }
    public static void inOrder(TreeNode root){
        while(!inArr.isEmpty() || root!=null){
            if(root!=null){
                inArr.push(root);
                root = root.left;
            }else{
                TreeNode t = inArr.pop();
                System.out.print(t.val+" ");
                root = t.right;
            }
        }
    }
    public static void afterOrder(TreeNode root){
        TreeNode pre = null;
        while(!afterArr.isEmpty() || root!=null){
            while(root!=null){
                afterArr.push(root);
                root = root.left;
            }
            root = afterArr.pop();//通过栈可以确定,当前出栈元素的左子树都已经访问过了,剩下右子树需要靠pre来确定是否访问过
            if(root.right==null || root.right==pre){
                //右子树为空或者已被访问
                System.out.print(root.val+" ");
                pre = root;
                root = null;//设为空避免下次的while循环
            }else {
                afterArr.push(root);
                root = root.right;
            }
        }
    }

    public static void main(String[] args) {
        TreeNode treeNode = new TreeNode(1);
        TreeNode treeNode1 = new TreeNode(2);
        TreeNode treeNode2 = new TreeNode(3);
        TreeNode treeNode3 = new TreeNode(4);
        TreeNode treeNode4 = new TreeNode(5);
        TreeNode treeNode5 = new TreeNode(6);
        treeNode.left = treeNode1;
        treeNode.right = treeNode2;
        treeNode1.left = treeNode3;
        treeNode1.right = treeNode4;
        treeNode2.left = treeNode5;
        preOrder(treeNode);
        System.out.println();
        inOrder(treeNode);
        System.out.println();
        afterOrder(treeNode);

    }
}
class TreeNode {
      int val;
      TreeNode left = null;
      TreeNode right = null;
      TreeNode() {}
      TreeNode(int val) { this.val = val; }
      TreeNode(int val, TreeNode left, TreeNode right) {
          this.val = val;
          this.left = left;
          this.right = right;
      }
}