二叉树 中序、前序、后序遍历 ,递归实现及非递归实现(Java)

遍历递归实现

中序遍历

    public static List<Integer> inorderTraversal(TreeNode root){
        List<Integer> nodes = new LinkedList<>();

        dfs(root, nodes);

        return nodes;
    }

    private static void dfs(TreeNode root, List<Integer> nodes) {
        if(root != null){
            dfs(root.left, nodes);
            nodes.add(root.val);
            dfs(root.right, nodes);
        }
    }

前序遍历

只用将dfsnodes.add(root.val)移至dfs(root.left, nodes)

后遍历

只用将dfsnodes.add(root.val)移至dfs(root.right, nodes)

非递归实现

中序遍历

public static List<Integer> inorderTraversal(TreeNode root){
        List<Integer> nodes = new LinkedList<>();
        Deque<TreeNode> stack = new ArrayDeque<>();
        TreeNode cur = root;

        while(cur != null || !stack.isEmpty()){
            while(cur != null){
                stack.push(cur);
                cur = cur.left;
            }

            cur = stack.pop();
            nodes.add(cur.val);
            cur = cur.right;
        }
        
        return nodes;
    }

先序遍历

public static List<Integer> preOrderTraversal(TreeNode root){
        List<Integer> nodes = new LinkedList<>();
        Deque<TreeNode> stack = new ArrayDeque<>();
        TreeNode cur = root;

        while(cur != null || !stack.isEmpty()){
            while(cur != null){
                nodes.add(cur.val);
                stack.push(cur);
                cur = cur.left;
            }

            cur = stack.pop();
            cur = cur.right;
        }

        return nodes;
    }

后续遍历

    public static List<Integer> postOrderTraversal(TreeNode root){
        List<Integer> nodes = new LinkedList<>();
        Deque<TreeNode> stack = new ArrayDeque<>();
        TreeNode cur = root, prev = null;

        while(cur != null || !stack.isEmpty()){
            while(cur != null){
                stack.push(cur);
                cur = cur.left;
            }

            cur = stack.peek();
            if(cur.right != null && cur.right != prev){
                cur = cur.right;
            }else{
                stack.pop();
                nodes.add(cur.val);
                prev = cur;
                cur = null;
            }
        }

        return nodes;
    }
posted @ 2022-05-16 22:13  叶拂衣  阅读(70)  评论(0)    收藏  举报