代码随想录-Day15

1.LeetCode 102.二叉树的层序遍历

题目链接:力扣刷题

文字讲解版:代码随想录

视频链接:B站视频讲解

给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。

接下来我们再来介绍二叉树的另一种遍历方式:层序遍历。

层序遍历一个二叉树。就是从左到右一层一层的去遍历二叉树。这种遍历的方式和我们之前讲过的都不太一样。

需要借用一个辅助数据结构即队列来实现,队列先进先出,符合一层一层遍历的逻辑,而用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。

具体JAVA代码如下:

层次遍历:

class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> result = new ArrayList<>();
        Queue<TreeNode> queue = new LinkedList<>();
        if(root == null){
            return result;
        }
        // 将root加入到队列中
        queue.offer(root);
        while (!queue.isEmpty()){
            //新建一维数组,存放每一层的数据
            List<Integer> list = new ArrayList<>();
            int len = queue.size();
            // 遍历层级
            while (len > 0){
                TreeNode temp = queue.poll();
                list.add(temp.val);
                if(temp.left != null){
                    queue.offer(temp.left);
                }
                if(temp.right != null){
                    queue.offer(temp.right);
                }
                len--;
            }
            // 每走一次循环,都要将list数组的东西加载到resule里面去
            result.add(list);
        }
        return result;

    }
       
}

 2.LeetCode 107.二叉树的层序遍历

题目链接:力扣刷题

文字讲解版:代码随想录

视频链接:B站视频讲解

给你二叉树的根节点 root ,返回其节点值 自底向上的层序遍历 。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)

示例 1:

输入:root = [3,9,20,null,null,15,7]
输出:[[15,7],[9,20],[3]]

思路:这题思路和上面102题的解决思路的方法是差不多的,我们最后将返回的数组翻转一下即可。
class Solution {
    public List<List<Integer>> levelOrderBottom(TreeNode root) {
        Queue<TreeNode> queue = new LinkedList<>();
        List<List<Integer>> result = new ArrayList<>();
        if(root == null){
            return result;
        }
        queue.offer(root);
        while (!queue.isEmpty()){
            int len = queue.size();
            List<Integer> list = new ArrayList<>();
            while (len>0){
                TreeNode temp = queue.poll();
                list.add(temp.val);
                if(temp.left !=null){
                    queue.offer(temp.left);
                }
                if(temp.right != null){
                    queue.offer(temp.right);
                }
                len --;
            }
            result.add(list);
        }
        // 反转二维数组
        List<List<Integer>> result2 = new ArrayList<>();
        for(int i = result.size()-1;i>=0;i--){
            result2.add(result.get(i));
        }
        return result2;

    }
}

 3.LeetCode 199.二叉树的右视图

题目链接:力扣刷题

文字讲解版:代码随想录

视频链接:B站视频讲解

 给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。

示例 1:

输入: [1,2,3,null,5,null,4]
输出: [1,3,4]

思路:我们还是参考层序遍历,首先还是判断队列不为空,其次我们进行for循环

当我们进行遍历到最后一个的时候,我们将数据插入到数组中。

java代码具体如下:

class Solution {
    public List<Integer> rightSideView(TreeNode root) {
        Queue<TreeNode> queue = new LinkedList<>();
        List<Integer> list = new ArrayList<>();
        if(root == null){
            return list;
        }
        queue.offer(root);
        while (!queue.isEmpty()){
            int len = queue.size();
            // 进行for循环,从0到每一层的个数,走到最后一个的时候进行判断处理。
            for(int i = 0; i < len;i++){
                TreeNode temp = queue.poll();
                if(temp.left != null){
                    queue.offer(temp.left);
                }
                if(temp.right != null){
                    queue.offer(temp.right);
                }
                // 当进行遍历到这一层的最后一个的时候,我们就将这个数据加入到list中
                if(i == len -1){
                    list.add(temp.val);
                }
            }
        }
        return  list;
    }
}

  4.LeetCode 637.二叉树的平均值

题目链接:力扣刷题

文字讲解版:代码随想录

视频链接:B站视频讲解

给定一个非空二叉树的根节点 root , 以数组的形式返回每一层节点的平均值。与实际答案相差 10-5 以内的答案可以被接受。

示例 1:

输入:root = [3,9,20,null,null,15,7]
输出:[3.00000,14.50000,11.00000]
解释:第 0 层的平均值为 3,第 1 层的平均值为 14.5,第 2 层的平均值为 11 。
因此返回 [3, 14.5, 11] 。

 java代码如下:

class Solution {
     public List<Double> averageOfLevels(TreeNode root) {
        List<Double> result = new ArrayList<>();
        if(root == null){
            return result;
        }
        Deque<TreeNode> deque = new LinkedList<>();
        deque.offerLast(root);
        while (!deque.isEmpty()){
            double sumtotal =0.0 ;
            int len  =deque.size();
            for(int i =0 ;i <len;i++){
                TreeNode temp = deque.pollFirst();
                sumtotal += temp.val;
                if(temp.left != null){
                    deque.offerLast(temp.left);
                }
                if(temp.right != null){
                    deque.offerLast(temp.right);
                }
            }
            result.add(sumtotal/len);
        }
        return result;
    }
}

  5.LeetCode 429.N叉树的层序遍历

题目链接:力扣刷题

文字讲解版:代码随想录

视频链接:B站视频讲解

给定一个 N 叉树,返回其节点值的层序遍历。(即从左到右,逐层遍历)。

树的序列化输入是用层序遍历,每组子节点都由 null 值分隔(参见示例)。

示例 1:

输入:root = [1,null,3,2,4,null,5,6]
输出:[[1],[3,2,4],[5,6]]

java代码如下:

class Solution {
    public List<List<Integer>> levelOrder(Node root) {
        Deque<Node> queue = new LinkedList<>();
        List<List<Integer>> result = new ArrayList<>();
        if(root == null){
            return result;
        }
        queue.offerLast(root);
        while (!queue.isEmpty()){
            int len = queue.size();
            List<Integer> list = new ArrayList<>();
            for(int i =0;i < len;i++){
                Node temp = queue.pollFirst();
                list.add(temp.val);
                List<Node> children = temp.children;
                // 如果某个节点的孩子数为0,那我们就继续。
                if(children == null || children.size() ==0){
                    continue;
                }
                // 遍历孩子数
                for(Node child : children ){
                    queue.offerLast(child);
                }
            }
            result.add(list);
        }
        return result;
    }
}

  6.LeetCode 116.填充每个节点的下一个右侧结点指针

题目链接:力扣刷题

文字讲解版:代码随想录

视频链接:B站视频讲解

给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:

struct Node {
  int val;
  Node *left;
  Node *right;
  Node *next;
}

填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL

初始状态下,所有 next 指针都被设置为 NULL

java代码如下:

class Solution {
    public Node connect(Node root) {
        Queue<Node> queue = new LinkedList<>();
        if(root == null){
            return root;
        }
        queue.add(root);
        while (!queue.isEmpty()){
            int len = queue.size();
            Node temp = queue.poll();
            if(temp.left != null){
                queue.offer(temp.left);
            }
            if(temp.right != null){
                queue.offer(temp.right);
            }
            //第一个元素在上面已经被取出来了,所以循环需要从1开始
            for(int index =1;index<len;index++){
                Node next = queue.poll();
                // 我们要将第二个取出的元素的左右孩子也要加入到队列中。
                if(next.left != null){
                    queue.offer(next.left);
                }
                if(next.right != null){
                    queue.offer(next.right);
                }
                // 同一层取出的下一区域为next
                temp.next = next;
                // temp 为第二个节点了
                temp = next;
            }

        }
        return root;
    }
}

  7.LeetCode 117.填充每个节点的下一个右侧结点指针2

题目链接:力扣刷题

文字讲解版:代码随想录

视频链接:B站视频讲解

给定一个二叉树:

struct Node {
  int val;
  Node *left;
  Node *right;
  Node *next;
}

填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL 。

初始状态下,所有 next 指针都被设置为 NULL 。

示例 1:

输入:root = [1,2,3,4,5,null,7]
输出:[1,#,2,3,#,4,5,7,#]
解释:给定二叉树如图 A 所示,你的函数应该填充它的每个 next 指针,以指向其下一个右侧节点,如图 B 所示。序列化输出按层序遍历顺序(由 next 指针连接),'#' 表示每层的末尾。

Java代码如下:

class Solution {
    public Node connect(Node root) {
        Queue<Node> queue = new LinkedList<>();
        if (root != null) {
            queue.add(root);
        }
        while (!queue.isEmpty()) {
            int size = queue.size();
            Node node = null;
            Node nodePre = null;

            for (int i = 0; i < size; i++) {
                if (i == 0) {
                    nodePre = queue.poll(); // 取出本层头一个节点
                    node = nodePre;
                } else {
                    node = queue.poll();
                    nodePre.next = node; // 本层前一个节点 next 指向当前节点
                    nodePre = nodePre.next;
                }
                if (node.left != null) {
                    queue.add(node.left);
                }
                if (node.right != null) {
                    queue.add(node.right);
                }
            }
            nodePre.next = null; // 本层最后一个节点 next 指向 null
        }
        return root;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值