• LeetCode刷题:二叉树层序遍历相关题目


    前言

    刷题路线来自代码随想录

    102.二叉树的层序遍历

    层序遍历

    题目描述

    给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。
    在这里插入图片描述

    前提知识

    在解决这道题目之前,我们应该先了解什么是层序遍历
    层序遍历一个二叉树。就是从左到右一层一层的去遍历二叉树。
    队列先进先出,符合一层一层遍历的逻辑,我们可以使用队列来实现层序遍历
    在这里插入图片描述

    public void levelOrderTraversal(Node root){
        if(root==null){
            return;
        }
        Queue<Node> queue=new LinkedList<>();
        queue.offer(root);
        while(!queue.isEmpty()){
            Node node=queue.poll();
            System.out.print(node.val+" ");
            if(node.left!=null) {
                queue.offer(node.left);
            }
            if(node.right!=null) {
                queue.offer(node.right);
            }
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    代码

    class Solution {
    	public List<List<Integer>> levelOrder(TreeNode root) {
    		if(root==null) {
    			return new ArrayList<List<Integer>>();
    		}
    		
    		List<List<Integer>> res = new ArrayList<List<Integer>>();
    		Queue<TreeNode> queue = new LinkedList<TreeNode>();
    		//将根节点放入队列中,然后不断遍历队列
    		queue.add(root);
    		while(queue.size()>0) {
    			//获取当前队列的长度,这个长度相当于 当前这一层的节点个数
    			int size = queue.size();
    			ArrayList<Integer> tmp = new ArrayList<Integer>();
    			//将队列中的元素都拿出来(也就是获取这一层的节点),放到临时list中
    			//如果节点的左/右子树不为空,也放入队列中
    			for(int i=0;i<size;++i) {
    				TreeNode t = queue.poll();
    				tmp.add(t.val);
    				if(t.left!=null) {
    					queue.offer(t.left);
    				}
    				if(t.right!=null) {
    					queue.offer(t.right);
    				}
    			}
    			//将临时list加入最终返回结果中
    			res.add(tmp);
    		}
    		return res;
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    107二叉树的层序遍历II


    107.二叉树的层序遍历II

    题目描述

    给你二叉树的根节点 root ,返回其节点值 自底向上的层序遍历 。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)
    在这里插入图片描述
    提示:

    树中节点数目在范围 [0, 2000] 内
    -1000 <= Node.val <= 1000

    其实这题和上面那一题思路是一样的,只要最后再把集合中的元素反转一下就好了

    代码

    class Solution {
        public List<List<Integer>> levelOrderBottom(TreeNode root) {
            List<List<Integer>> list=new ArrayList();
             List<List<Integer>> rs=new ArrayList();
            if(root==null){
                return rs;
            }
            Queue<TreeNode> queue=new LinkedList();
            queue.offer(root);
            while(!queue.isEmpty()){
                //获取当层有多少元素
                int len=queue.size();
                List<Integer> temp=new ArrayList();
                for(int i=0;i<len;i++){
                    TreeNode node= queue.poll();
                    temp.add(node.val);
                    if(node.left!=null){
                        queue.offer(node.left);
                    }
                    if(node.right!=null){
                        queue.offer(node.right);
                    }
                }
                  list.add(temp);
            }
          
            //反转
          for(int i=list.size()-1;i>=0;i--){
              rs.add(list.get(i));
          }
            return rs;
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    199.二叉树的右视图

    199.二叉树的右视图

    题目描述

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

    在这里插入图片描述

    思路

    层序遍历的时候,判断是否遍历到该层的最后面的元素,如果是,就放进list集合中,随后返回list就可以了。

    代码

    class Solution {
        public List<Integer> rightSideView(TreeNode root) {
            List<Integer> list=new ArrayList();
            Queue<TreeNode> queue=new LinkedList();
            if(root==null) return list;
            queue.offer(root);
            /**
            
              我们需要判断是否遍历当前层次的最后一个节点
            
             */
                while(!queue.isEmpty()){
                    int len=queue.size();
                    for(int i=0;i<len;i++){
                        TreeNode node=queue.poll();
                        if(node.left!=null){
                            queue.offer(node.left);
                        }
                        if(node.right!=null){
                            queue.offer(node.right);
                        }
                        //判断是否遍历到最后一个节点
                        if(i==len-1){
                            list.add(node.val);
                        }
                    }
                }
            return list;
            }
        
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    637.二叉树的层平均值

    637.二叉树的层平均值

    题目描述

    给定一个非空二叉树的根节点 root , 以数组的形式返回每一层节点的平均值。与实际答案相差 10-5 以内的答案可以被接受。
    在这里插入图片描述
    提示:

    树中节点数量在 [1, 104] 范围内
    -231 <= Node.val <= 231 - 1

    思路

    我们只需要在层序遍历的时候,获取当前这层有多少元素,然后对他们的元素值进行相加,然后把平均值添加到list集合中

    代码

    class Solution {
        public List<Double> averageOfLevels(TreeNode root) {
            List<Double> list=new ArrayList();
            Queue<TreeNode> queue= new LinkedList();
            if(root==null){
                return list;
            }
            queue.offer(root);
           double sum=0.0;
            while(!queue.isEmpty()){
                //获取这一层有多少元素
                int len=queue.size();
                for(int i=0;i<len;i++){
                    TreeNode node=queue.poll();
                    sum+=node.val;
                    if(node.left!=null){
                        queue.offer(node.left);
                    }
                    if(node.right!=null){
                        queue.offer(node.right);
                    }
                }
                list.add( sum/len);
                sum=0;
            }
            return list;
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    429.N叉树的层序遍历

    题目描述

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

    树的序列化输入是用层序遍历,每组子节点都由 null 值分隔(参见示例)。
    在这里插入图片描述
    提示:

    树的高度不会超过 1000
    树的节点总数在 [0, 10^4] 之间

    思路

    这题其实和二叉树的层序遍历思路一样,区别只是说,对于N叉树,一个节点可能有多个子节点

    代码

    class Solution {
          public List<List<Integer>> levelOrder(Node root) {
            if (root == null) {
                return new ArrayList<List<Integer>>();
            }
    
            List<List<Integer>> ans = new ArrayList<List<Integer>>();
            Queue<Node> queue = new ArrayDeque<Node>();
            queue.offer(root);
    
            while (!queue.isEmpty()) {
                int cnt = queue.size();
                List<Integer> level = new ArrayList<Integer>();
                for (int i = 0; i < cnt; ++i) {
                    Node cur = queue.poll();
                    level.add(cur.val);
                    for (Node child : cur.children) {
                        queue.offer(child);
                    }
                }
                ans.add(level);
            }
    
            return ans;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

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

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

    题目描述

    给定一棵二叉树的根节点 root ,请找出该二叉树中每一层的最大值。
    在这里插入图片描述

    思路

    层序遍历,用一个变量temp来记录当层已经遍历的节点的最大值,temp和当前节点的val比较,把二者的较大值赋值给temp

    代码

    class Solution {
        public List<Integer> largestValues(TreeNode root) {
            if(root==null){
                return new ArrayList<Integer>();
            }
            List<Integer> list = new ArrayList();
            Queue<TreeNode> queue = new LinkedList();
            queue.offer(root);
            while(!queue.isEmpty()){
                int len=queue.size();
                int temp=Integer.MIN_VALUE;
                for(int i=0;i<len;i++){
                    TreeNode node= queue.poll();
                    temp=Math.max(temp,node.val);
                    if(node.left!=null){
                        queue.offer(node.left);
                    }
                    if(node.right!=null){
                        queue.offer(node.right);
                    }
                }
                list.add(temp);
            }
                return list;
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

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

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

    题目描述

    在这里插入图片描述

    思路

    在层序遍历的时候,我们需要判断一下,我们遍历的这个节点是不是这层的最后一个元素,如果不是最后一个元素,那么就让当前节点的next指向下一个节点

    代码

    class Solution {
        public Node connect(Node root) {
            if(root==null) return null;
            
            Queue<Node> queue=new LinkedList();
            queue.offer(root);
            while(!queue.isEmpty()){
                int len=queue.size();
                for(int i=0;i<len;i++){
                    Node curr= queue.poll();
                    //判断同一层是否还有节点
                    //如果还有节点,则next指向下一个节点,否则指向空
                    if(i!=len-1){
                        //说明还有下一个节点,此时我们通过调用element方法获得对首元素,此时的队首元素就是当前节点的下一个节点
                        curr.next=queue.element();
                    }
                    //把当前节点的左右孩子加入队列
                    if(curr.left!=null){
                        queue.offer(curr.left);
                    }   
                    if(curr.right!=null){
                        queue.offer(curr.right);
                    }             
                }
            }
            return root;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    104.二叉树的最大深度

    104.二叉树的最大深度

    题目描述

    在这里插入图片描述

    思路

    使用迭代法的话,使用层序遍历是最为合适的,因为最大的深度就是二叉树的层数,和层序遍历的方式极其吻合。

    在二叉树中,一层一层的来遍历二叉树,记录一下遍历的层数就是二叉树的深度

    代码

    //非递归
    class Solution {
        public int maxDepth(TreeNode root) {
            if(root==null) return 0;
            int depth=0;
            Queue<TreeNode> queue=new LinkedList();
            queue.offer(root);
            while(!queue.isEmpty()){
                int len=queue.size();
                //只要把当前这一层所有的节点都出队,则depth+1
                for(int i=0;i<len;i++){
                    TreeNode node=queue.poll();
                    if(node.left!=null){
                        queue.offer(node.left);
                    }
                    if(node.right!=null){
                        queue.offer(node.right);
                    }
                }
                depth++;
    
    
            }
            return depth;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    其他人的解法

    ACM 选手图解 LeetCode 二叉树的最大深度(递归 + 非递归)| 编程文青李狗蛋

    111.二叉树的最小深度

    111.二叉树的最小深度

    题目描述

    给定一个二叉树,找出其最小深度。

    最小深度是从根节点到最近叶子节点的最短路径上的节点数量。

    说明:叶子节点是指没有子节点的节点。
    在这里插入图片描述

    思路

    用层序遍历的方法遍历整棵树。
    当我们找到一个叶子节点时,直接返回这个叶子节点的深度。广度优先搜索的性质保证了最先搜索到的叶子节点的深度一定最小。

    代码

    class Solution {
        public int minDepth(TreeNode root) {
             if (root == null) {
                return 0;
            }
            Queue<TreeNode> queue = new LinkedList<>();
            queue.offer(root);
            int depth = 0;
            while (!queue.isEmpty()){
                int size = queue.size();
                depth++;
                TreeNode cur = null;
                for (int i = 0; i < size; i++) {
                    cur = queue.poll();
                    //如果当前节点的左右孩子都为空,直接返回最小深度
                    if (cur.left == null && cur.right == null){
                        return depth;
                    }
                    if (cur.left != null) queue.offer(cur.left);
                    if (cur.right != null) queue.offer(cur.right);
                }
            }
            return depth;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    其他人的解法

    ACM 选手图解 LeetCode 二叉树的最小深度(递归 + 非递归)| 编程文青李狗蛋

  • 相关阅读:
    pandas使用fillna函数填充dataframe中所有数据列的缺失值、使用中位数(median)填充dataframe所有数据列中的缺失值
    spring学习第二天_Spring Ioc(1)
    python代码里不写for循环?更简洁、规范、结构化~
    基于ssm的的律师事务管理系统的设计与实现
    java计算机毕业设计海南自贸港知识学习与测试源码+mysql数据库+系统+lw文档+部署
    ML XGBoost详细原理及公式推导讲解+面试必考知识点
    【STM32】入门(十一):初识uCOS-III
    SpringCloud之微服务实用篇1
    ClickHouse面向列的数据库管理系统(原理简略理解)
    25 个超棒的 Python 脚本合集
  • 原文地址:https://blog.csdn.net/qq_52797170/article/details/125903838