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

144. 二叉树的前序遍历

题目链接:https://leetcode.cn/problems/binary-tree-preorder-traversal/description/

题目要求:

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

示例 1:

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

输入:root = [1,null,2,3]

输出:[1,2,3]

示例 2:

输入:root = []

输出:[]

总结:树的前中后序遍历,采用递归法,要分为三部走,1.确定递归函数的参数,谁始终要跟着进入函数2.确定递归的终止条件,否则会报错3.确定每个函数内部要执行的操作。递归法本质其实也是用栈来实现的,所以我们可以用栈直接来实现遍历,也就是迭代法,仔细阅读代码会有所收获,统一迭代法还需要补充学习(先略过去了)。

递归法:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    //递归法前序遍历
    public List preorderTraversal(TreeNode root) {
        List res = new ArrayList<>();
        preorder(root,res);
        return res;
    }
    public void preorder(TreeNode node,List res){
        if(node ==null) return;
        res.add(node.val);
        preorder(node.left,res);
        preorder(node.right,res);
    } 
}

迭代法:

class Solution {
    //迭代法前序遍历
    public List preorderTraversal(TreeNode root) {
        Stack stack = new Stack<>();
        List res = new ArrayList<>();
        if(root == null){
            return res;
        }
        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. 二叉树的中序遍历

题目链接:https://leetcode.cn/problems/binary-tree-inorder-traversal/description/

题目要求:

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

示例 1:

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

输入:root = [1,null,2,3]

输出:[1,3,2]

示例 2:

输入:root = []

输出:[]

总结:中序遍历二叉树使用迭代法时,不能简单的调换前序的顺序,因为遍历的节点与我们要操作的节点不是一个节点,我们需要先存左节点进返回数组中去。用一个指针记录我们遍历的每个节点,先顺着往左下,见一个节点先压入栈中,知道没左节点,此时该返回中节点了,也就是之前我们压入栈中的最新的那个节点,存到数组里去,然后指针指向其右边节点继续压入栈中重复之前操作。

递归法:

class Solution {
    //递归法
    public List inorderTraversal(TreeNode root) {
        List res = new ArrayList<>();
        inorder(root,res);
        return res;
    }
    public void inorder(TreeNode node,List res){
        if(node == null) return;
        inorder(node.left,res);
        res.add(node.val);
        inorder(node.right,res);
    }
}

迭代法:

class Solution {
    //迭代法 中序遍历有些独特,每次遍历的节点与要操作存res数组里的节点不是一个
    public List inorderTraversal(TreeNode root) {
        List res = new ArrayList<>();
        Stack stack = new Stack<>();
        //定义一个指针用来遍历各个节点
        TreeNode cur = root;
        if(root == null){
            return res;
        }
        while(cur !=null || !stack.isEmpty()){
            if(cur !=null){
                stack.push(cur);
                cur = cur.left;
            }else{
                cur = stack.pop();
                res.add(cur.val);
                cur = cur.right;
            }
        }
        return res;
    }
   
}

145. 二叉树的后序遍历

题目链接:https://leetcode.cn/problems/binary-tree-postorder-traversal/description/

题目要求:

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

示例 1:

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

输入:root = [1,null,2,3]

输出:[3,2,1]

示例 2:

输入:root = []

输出:[]

总结:后序遍历二叉树用迭代法的时候,因为前序是中左右的顺序,把前序遍历方法左右节点压入栈中的顺序颠倒下就变成中右左的顺序了,得到最终的数组后,再调用reverse方法将数组反转,得到左右中的顺序,即正好为后序遍历的顺序。

递归法:

class Solution {
    //递归法
    public List postorderTraversal(TreeNode root) {
        List res = new  ArrayList<>();
        postorder(root,res);
        return res;            
    }
    public void postorder(TreeNode node,List res){
        if(node == null) return;
        postorder(node.left,res);
        postorder(node.right,res);
        res.add(node.val);
    }
}

迭代法:

class Solution {
    //迭代法后序遍历 前序遍历中左右,左右调换顺序,中右左,再数组反转,左右中即为后序遍历
    public List postorderTraversal(TreeNode root) {
        List res = new  ArrayList<>();
        Stack stack = new Stack<>();
        if(root ==null){
            return res;
        }
        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;            
    }
 
}

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