代码随想录算法训练营第十四天|144.二叉树的前序遍历 94.二叉树的中序遍历 145.二叉树的后序遍历

144.二叉树的前序遍历 

给你二叉树的根节点 root ,返回它节点值的 前序 遍历。

递归遍历

class Solution {
    public List preorderTraversal(TreeNode root) {
        List res = new LinkedList<>();
        helper(res,root);
        return res;
    }
    private void helper(List res, TreeNode root){
        if(root==null){
            return;
        }
        res.add(root.val);
        helper(res,root.left);
        helper(res,root.right);
    }
}

前序遍历顺序是:中 左 右

迭代遍历

class Solution {
    public List preorderTraversal(TreeNode root) {
        List res = new LinkedList<>();
        if(root ==null){
            return res;
        }
        Stack stack = new Stack<>();
        stack.push(root);
        while(!stack.isEmpty()){
            TreeNode node = stack.pop();
            res.add(node.val);
            if(node.right!=null){
                stack.push(node.right);
            }
            if(node.left!=null){
                stack.push(node.left);
            }
        }
        return res;

    }
}

入栈顺序是 中 右 左 - > 出栈顺序 中 左 右

94.二叉树的中序遍历

给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。

递归遍历

class Solution {
    public List inorderTraversal(TreeNode root) {
        List res = new LinkedList<>();
        helper(res,root);
        return res;
    }
    private void helper(List res, TreeNode root){
        if(root==null){
            return;
        }
        helper(res,root.left);
        res.add(root.val);
        helper(res,root.right);
    }
}

中序遍历的顺序是:左 中 右

迭代遍历

class Solution {
    public List inorderTraversal(TreeNode root) {
        List res = new LinkedList<>();
        if(root==null){
            return res;
        }
        Stack stack = new Stack<>();
        TreeNode curr = root;
        while(curr!=null||!stack.isEmpty()){
            if(curr!=null){
                stack.push(curr);
                curr = curr.left;
            }else{
                curr = stack.pop();
                res.add(curr.val);
                curr = curr.right;
            }
        }
        return res;
    }
}

入栈顺序是 左 右

需要用到指针

145.二叉树的后序遍历

递归遍历

给你一棵二叉树的根节点 root ,返回其节点值的 后序遍历 

class Solution {
    public List postorderTraversal(TreeNode root) {
        List res = new LinkedList<>();
        helper(res, root);
        return res;
    }
    private void  helper(List res , TreeNode root){
        if(root==null){
            return;
        }
        helper(res,root.left);
        helper(res,root.right);
        res.add(root.val);
    }
}

后序遍历的顺序是: 左 右 中

迭代遍历

前序遍历的顺序是: 中 左 右 调整左右孩子入栈顺序变成 中 右 左 反转list变成 左 右 中

class Solution {
    public List postorderTraversal(TreeNode root) {
        List res = new LinkedList<>();
        if(root==null){
            return res;
        }
        Stack stack = new Stack<>();
        stack.push(root);
        while(!stack.isEmpty()){
            TreeNode node = stack.pop();
            res.add(node.val);
            if(node.left!=null){
                stack.push(node.left);
            }
            if(node.right!=null){
                stack.push(node.right);
            }
        }
        Collections.reverse(res);
        return res;
    }
}

你可能感兴趣的:(leetcode,java,算法)