首页 > 其他分享 >代码随想录Day17

代码随想录Day17

时间:2022-11-05 16:34:20浏览次数:42  
标签:Node null int 代码 随想录 Day17 que poll root

LeetCode 199.二叉树右视图

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

 

 

 层序遍历一个思路,只需要判断当前元素是否是最后一个元素,仅保存最后一个元素就可以了。

// 199.二叉树的右视图
public class N0199 {
    /**
     * 解法:队列,迭代。
     * 每次返回每层的最后一个字段即可。
     *
     * 小优化:每层右孩子先入队。代码略。
     */
    public List<Integer> rightSideView(TreeNode root) {
        List<Integer> list = new ArrayList<>();
        Deque<TreeNode> que = new LinkedList<>();

        if (root == null) {
            return list;
        }

        que.offerLast(root);
        while (!que.isEmpty()) {
            int levelSize = que.size();

            for (int i = 0; i < levelSize; i++) {
                TreeNode poll = que.pollFirst();

                if (poll.left != null) {
                    que.addLast(poll.left);
                }
                if (poll.right != null) {
                    que.addLast(poll.right);
                }

                if (i == levelSize - 1) {
                    list.add(poll.val);
                }
            }
        }

        return list;
    }
}

 

LeetCode 637.二叉树的层平均值

 

思路:层序遍历,每一层的总和取个平均值即可。

// 637. 二叉树的层平均值
public class N0637 {

    /**
     * 解法:队列,迭代。
     * 每次返回每层的最后一个字段即可。
     */
    public List<Double> averageOfLevels(TreeNode root) {
        List<Double> list = new ArrayList<>();
        Deque<TreeNode> que = new LinkedList<>();

        if (root == null) {
            return list;
        }

        que.offerLast(root);
        while (!que.isEmpty()) {
            TreeNode peek = que.peekFirst();

            int levelSize = que.size();
            double levelSum = 0.0;
            for (int i = 0; i < levelSize; i++) {
                TreeNode poll = que.pollFirst();

                levelSum += poll.val;

                if (poll.left != null) {
                    que.addLast(poll.left);
                }
                if (poll.right != null) {
                    que.addLast(poll.right);
                }
            }
            list.add(levelSum / levelSize);
        }
        return list;
    }
}

 

LeetCode 429.N叉树的层序遍历

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

例如,给定一个 3叉树 :

 

 

返回其层序遍历:

[ [1], [3,2,4], [5,6] ]

// 429. N 叉树的层序遍历
public class N0429 {
    /**
     * 解法1:队列,迭代。
     */
    public List<List<Integer>> levelOrder(Node root) {
        List<List<Integer>> list = new ArrayList<>();
        Deque<Node> que = new LinkedList<>();

        if (root == null) {
            return list;
        }

        que.offerLast(root);
        while (!que.isEmpty()) {
            int levelSize = que.size();
            List<Integer> levelList = new ArrayList<>();

            for (int i = 0; i < levelSize; i++) {
                Node poll = que.pollFirst();

                levelList.add(poll.val);

                List<Node> children = poll.children;
                if (children == null || children.size() == 0) {
                    continue;
                }
                for (Node child : children) {
                    if (child != null) {
                        que.offerLast(child);
                    }
                }
            }
            list.add(levelList);
        }

        return list;
    }

    class Node {
        public int val;
        public List<Node> children;

        public Node() {}

        public Node(int _val) {
            val = _val;
        }

        public Node(int _val, List<Node> _children) {
            val = _val;
            children = _children;
        }
    }
}

 

LeetCode 515.在每个树行中找最大值

 

 

 思路:

层序遍历,取每层的最大值。

class Solution {
    public List<Integer> largestValues(TreeNode root) {
        if(root == null){
            return Collections.emptyList();
        }
        List<Integer> result = new ArrayList();
        Queue<TreeNode> queue = new LinkedList();
        queue.offer(root);
        while(!queue.isEmpty()){
            int max = Integer.MIN_VALUE;
            for(int i = queue.size(); i > 0; i--){
               TreeNode node = queue.poll();
               max = Math.max(max, node.val);
               if(node.left != null) queue.offer(node.left);
               if(node.right != null) queue.offer(node.right);
            }
            result.add(max);
        } 
        return result;
    }
}

 

LeetCode116.填充每个节点的下一个右侧节点指针

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

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

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

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

 

思路:

本题依然是层序遍历,只不过在单层遍历的时候记录一下本层的头部节点,然后在遍历的时候让前一个节点指向本节点就可以了

class Solution {
    public Node connect(Node root) {
    Queue<Node> tmpQueue = new LinkedList<Node>();
    if (root != null) tmpQueue.add(root);
        
    while (tmpQueue.size() != 0){
        int size = tmpQueue.size();
            
            Node cur = tmpQueue.poll();
            if (cur.left != null) tmpQueue.add(cur.left);
            if (cur.right != null) tmpQueue.add(cur.right);
            
        for (int index = 1; index < size; index++){
        Node next = tmpQueue.poll();
        if (next.left != null) tmpQueue.add(next.left);
        if (next.right != null) tmpQueue.add(next.right);
                
                cur.next = next;
                cur = next;
        }
    }
        
        return root;
    }
}

 

 

 

标签:Node,null,int,代码,随想录,Day17,que,poll,root
From: https://www.cnblogs.com/dwj-ngu/p/16860487.html

相关文章

  • Linux共享内存通信的C语言Demo代码
    重点注明:本文代码来源于:https://blog.csdn.net/github_38294679/article/details/122360026  =====================================================  使用p......
  • 阅读代码技巧
    如何快速上手?一、了解业务梳理实现的业务功能1.系统有没有文档、教程、分享文章等2.代码的主要业务功能是什么3.业务功能使用的角色是哪些,数量是多少,种类是多少4.业......
  • 20行代码简单python爬虫,爬虫实例
    函数介绍 函数功能简单介绍 库函数介绍 importrequests#请求网页fromlxmlimportetree#对网页进行解析函数功能介绍  函数1 defgetdata(url):......
  • #Primavera Unifier:关于零代码/低代码平台特点【1/3】
    在之前对Unifier的介绍中,我提到了Unifier应用的一个非常关键的特征,及零代码快速配置使用,而为了更好的介绍OraclePrimaveraUnifier 的零代码特点,以下我将通过3篇内容来逐......
  • #Primavera Unifier:关于零代码/低代码平台特点【2/3】
     在之前对Unifier的介绍中,我提到了Unifier应用的一个非常关键的特征,及零代码快速配置使用,而为了更好的介绍OraclePrimaveraUnifier 的零代码特点,以下我将通过3篇内容来......
  • JS代码压缩
    JS代码压缩本文分享一种技术,用于实现JS代码压缩。该技术使用LZW算法。LZW算法又叫“串表压缩算法”,简而言之,通过建立一个字符串表,用较短的代码来表示较长的字符串来实现压缩......
  • 个人写代码的几个要点
    另外额外说一点,如果思路不清晰不妨先将业务逻辑通过注释打出来然后按照逻辑去写,如果没写注释写完后再打一遍注释有助于检查一遍逻辑和代码 保证业务清晰度,比如:一段逻辑要完......
  • 2023最新傻瓜式下载喜马拉雅音频文件,看不懂代码的你值得拥有
    傻瓜式教学如果还是学不会那不然,洗洗睡吧首先打开喜马拉雅网页版,随便点击一个节目,这里我用平时常听的“3分钟心理学”举例https://www.ximalaya.com/album/11848122......
  • 老资源分享之《Opengl游戏编程》代码
    徐明亮教授编写、同时应该也是他翻译的《3D游戏引擎》和《游戏物理学》  这本书的代码是以光盘提供的、鉴于现在人们都不用光盘了、那么贴个百度云链接吧: 链接:http......
  • Java swing 连连看小游戏 开发小系统 项目源代码 实训实验毕设
    Javaswing连连看小游戏开发小系统项目源代码实训实验能满足学习和二次开发可以作为初学者熟悉Java的学习,作为老师阶段性学习的一个成功检验不再是单调的理解老师空泛......