力扣打卡day12

二叉树的常见题目

1.144. 二叉树的前序遍历
方法一:递归法

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

方法二:非递归(迭代法)

// 前序遍历顺序:中-左-右,入栈顺序:中-右-左
class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> result = new ArrayList<>();
        if (root == null){
            return result;
        }
        Stack<TreeNode> stack = new Stack<>();
        stack.push(root);
        while (!stack.isEmpty()){
            TreeNode node = stack.pop();
            result.add(node.val);
            if (node.right != null){
                stack.push(node.right);
            }
            if (node.left != null){
                stack.push(node.left);
            }
        }
        return result;
    }
}

94. 二叉树的中序遍历
方法一:递归法

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

方法二:非递归(迭代法)

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

145. 二叉树的后序遍历
方法一:递归法

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

方法二:非递归(迭代法)

// 后序遍历顺序 左-右-中 入栈顺序:中-左-右 出栈顺序:中-右-左, 最后翻转结果
class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> result = new ArrayList<>();
        if (root == null){
            return result;
        }
        Stack<TreeNode> stack = new Stack<>();
        stack.push(root);
        while (!stack.isEmpty()){
            TreeNode node = stack.pop();
            result.add(node.val);
            if (node.left != null){
                stack.push(node.left);
            }
            if (node.right != null){
                stack.push(node.right);
            }
        }
        Collections.reverse(result);
        return result;
    }
}

102. 二叉树的层序遍历

class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        Queue<TreeNode> q=new LinkedList<>();
        List<List<Integer>> res=new ArrayList();
        if(root!=null){
            q.offer(root);
        }
        while(!q.isEmpty()){
            int size=q.size();
            List<Integer> level=new ArrayList();
            for(int i=0;i<size;i++){
                TreeNode cur=q.poll();
                level.add(cur.val);
                if(cur.left!=null){
                    q.offer(cur.left);
                }
                if(cur.right!=null){
                    q.offer(cur.right);
                }
            }
            res.add(level);
        }
        return res;
    }
}

107.二叉树的层次遍历II
先层序遍历,在反转数组即可

class Solution {
    public List<List<Integer>> levelOrderBottom(TreeNode root) {
        Queue<TreeNode> q=new LinkedList<>();
        List<List<Integer>> res=new ArrayList<>();
        if(root!=null){
            q.offer(root);
        }
        while(!q.isEmpty()){
            int size=q.size();
            List<Integer> level=new ArrayList<>();
            for(int i=0;i<size;i++){
                TreeNode cur=q.poll();
                level.add(cur.val);
                if(cur.left!=null){
                    q.offer(cur.left);
                }
                if(cur.right!=null){
                    q.offer(cur.right);
                }
            }
            res.add(level);
        }
        List<List<Integer>> result = new ArrayList<>();
        for(int i=res.size()-1;i>=0;i--){
            result.add(res.get(i));
        }
        return result;
    }
}

199.二叉树的右视图
层序遍历的时候,判断是否遍历到单层的最后面的元素,如果是,就放进level数组中,随后返回result就可以了。

class Solution {
    public List<Integer> rightSideView(TreeNode root) {
        Queue<TreeNode> q=new LinkedList<>();
        List<Integer> level=new ArrayList<>();
        if(root!=null){
            q.offer(root);
        }
        while(!q.isEmpty()){
            int size=q.size();
            for(int i=0;i<size;i++){
                TreeNode cur=q.poll();
                if(cur.left!=null){
                    q.offer(cur.left);
                }
                if(cur.right!=null){
                    q.offer(cur.right);
                }
                if(i==size-1){
                    level.add(cur.val);
                }
            }
            
        }
        return level;
    }
}

637.二叉树的层平均值
本题就是层序遍历的时候把一层求个总和在取一个均值。

class Solution {
    public List<Double> averageOfLevels(TreeNode root) {
        Queue<TreeNode> q=new LinkedList<>();
        List<Double> level=new ArrayList<>();
        if(root!=null){
            q.offer(root);
        }
        while(!q.isEmpty()){
            int size=q.size();
            double levelSum=0.0;
            for(int i=0;i<size;i++){
                TreeNode cur=q.poll();
                levelSum+=cur.val;
                if(cur.left!=null){
                    q.offer(cur.left);
                }
                if(cur.right!=null){
                    q.offer(cur.right);
                }  
            }
            level.add(levelSum/size);
        }
        return level;
    }
}

429. N 叉树的层序遍历

class Solution {
    public List<List<Integer>> levelOrder(Node root) {
        Queue<Node> q=new LinkedList<>();
        List<List<Integer>> res = new ArrayList<>();
        if(root!=null){
            q.offer(root);
        }
        while(!q.isEmpty()){//队列中没有元素层序遍历就终止了
            int size=q.size();//记录队列大小的个数就是每层有几个元素
            List<Integer> level=new ArrayList<>();
            for(int i=0;i<size;i++){
                Node cur=q.poll();
                level.add(cur.val);
                List<Node> children=cur.children;
                if (children == null || children.size() == 0) {
                    continue;
                }
                for(Node child:children){
                    if(child!=null){
                        q.offer(child);
                    }
                }
            }
            res.add(level);
        }
        return res;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值