代码随想录day14|二叉树的前序遍历. 二叉树的后序遍历. 二叉树的中序遍历

二叉树的前序遍历

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

分析 递归写法 1, 确定递归函数的参数和返回值 2, 明确终止条件 (到达空节点)  2确定单层递归的逻辑:前序遍历是中左右的循序,所以在单层递归的逻辑,是要先取中节点的数值

class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        preOrder(root,res);
        return res;
    }

    public void preOrder(TreeNode root,List<Integer> res ){
        if(root==null) return ;

        res.add(root.val);
        preOrder(root.left,res);
//    res.add(root.val);
      preOrder(root.right,res);
//    res.add(root.val);
 } }

分析 前序迭代写法  前序遍历是中左右,每次先处理的是中间节点,那么先将根节点放入栈中,然后将右孩子加入栈,再加入左孩子 (为了保证出栈顺序是 中左右)

class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> res= new ArrayList<>();
        Deque<TreeNode> deque = new LinkedList<>();
        if(root==null) return res;
        deque.offer(root);
        TreeNode temp;
        while(!deque.isEmpty()){
            temp=deque.pollLast();
            res.add(temp.val);
            if(temp.right!=null){
                deque.offer(temp.right);
            }
            if(temp.left!=null){
                deque.offer(temp.left);
            }
        }
        return res;
    }
}

分析 中序迭代法 中序遍历是左中右,先访问的是二叉树顶部的节点,然后一层一层向下访问,直到到达树左面的最底部,再开始处理节点(也就是在把节点的数值放进result数组中)

class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> res = new LinkedList<>();
        if(root==null) return res;

        Deque <TreeNode> deque= new LinkedList<>();

        TreeNode cur= root;
        while(cur!=null||!deque.isEmpty()){
            if(cur!=null){
                deque.offer(cur);
                cur= cur.left;
            }else if(cur==null){
                cur=deque.pollLast();
                res.add(cur.val);
                cur=cur.right;
            }
        }

        return res;
    }
}

分析 后序遍历 后序遍历顺序 左-右-中 入栈顺序:中-左-右 出栈顺序:中-右-左, 最后翻转结果

class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> res = new LinkedList<>();
        Deque<TreeNode> deque = new LinkedList<>();
  
     if(root==null) return res;        
      deque.offer(root); while(!deque.isEmpty()){ TreeNode temp = deque.pollLast(); res.add(temp.val); if(temp.left!=null){ deque.offer(temp.left); } if(temp.right!=null){ deque.offer(temp.right); } } Collections.reverse(res); return res; } }

  

posted @ 2023-02-28 22:15  绝云气负青天  阅读(21)  评论(0)    收藏  举报