Leetcode二叉树专题:层序遍历练习——102层序遍历,107二叉树的层序遍历2,515在每个树行中找最大值,199二叉树右视图

1、二叉树的层序遍历

1.题目描述
  1. 二叉树的层序遍历

给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。
示例:
二叉树:[3,9,20,null,null,15,7],
3
/
9 20
/
15 7

返回其层序遍历结果:
[
[3],
[9,20],
[15,7]
]

2.思想
  • 利用队列的先进先出的特点,遍历每一层,将每一层的结点从左到右入队列,为了准确记住每一层的结点值val,需要记录每一层的结点数,根据结点数出队,当遍历到这层最后一个结点的之后,将这层的结点数列表加入总列表,然后遍历下一层。
  • 第一层入队列就是1个根结点,如果它有子节点,那么子节点也入队,都插到队尾,那么遍历第一层只用循环一次。接着循环根节点的下一层结点。
3.代码
class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        //存储每一行的结点的队列
        Queue<TreeNode> que = new LinkedList<TreeNode>();
        //存储每一行的遍历结果的列表
        List<List<Integer>> result = new ArrayList<List<Integer>>();
        //先把根节点加入队列,再判断
        que.add(root);
        while(que.peek() != null){//当队列没有结点的时候停止遍历
            //记录这一层的结点个数
            int size = que.size();
            //专门存储这一层的所有结点val值的临时列表
            List<Integer> list = new ArrayList<Integer>();
            for(int i=0;i<size;i++){
                //从队列中取出队头的结点,直到这一层的结点取完
                TreeNode node = que.poll();
                //存入专门存储这一层的结点val值的临时列表
                list.add(node.val);
                //当取出的这一队头节点有子结点的时候,将子结点加入到队尾。由于有这一层的节点数量限制,所以不用怕这一层的结点和下一层的结点存入一个临时列表列表
                if(node.left != null){
                    que.add(node.left);
                }
                if(node.right != null){
                    que.add(node.right);
                }
            }
            result.add(list);
        }
        return result;
    }
}

在这里插入图片描述

2、层序遍历2

1.题目描述
  1. 二叉树的层序遍历 II

给定一个二叉树,返回其节点值自底向上的层序遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)
例如:
给定二叉树 [3,9,20,null,null,15,7],
3
/
9 20
/
15 7

返回其自底向上的层序遍历为:
[
[15,7],
[9,20],
[3]
]

2.思想

和从上到下的遍历思想是一样的,只是在添加到结果列表的时候从后往前加,list.add(a)是加到列表的后边,list.add(0,a)是加到列表的前边,这样先遍历的比如根节点,就放到了最后了。

3.代码
class Solution {
    public List<List<Integer>> levelOrderBottom(TreeNode root) {
        Queue<TreeNode> que = new LinkedList<>();
        List<List<Integer>> result = new ArrayList<>();  
        que.add(root);
        while(que.peek() != null){
            int size = que.size();
            List<Integer> list = new ArrayList<>();
            for(int i=0;i<size;i++){
                TreeNode node = que.poll();
                list.add(node.val);
                if(node.left != null){
                    que.add(node.left);
                }
                if(node.right != null){
                    que.add(node.right);
                }
            }
            result.add(0,list);
        }
        return result;
    }
}

在这里插入图片描述

3、在每个树行中找最大值

1.题目描述
  1. 在每个树行中找最大值

您需要在二叉树的每一行中找到最大的值。
示例:
输入:

      1
     / \
    3   2
   / \   \  
  5   3   9 

输出: [1, 3, 9]

2.思想

找到每一行的中最大值需要遍历每一行,即用层序遍历法,遍历方式和第一道题一样,区别是在多了一个取最大值max = Math.max(max,node.value)的过程

3.代码
class Solution {
    public List<Integer> largestValues(TreeNode root) {
        List<Integer> result = new ArrayList<>();
        Queue<TreeNode> que = new LinkedList<>();
        que.add(root);
        while(que.peek() != null){
            int size = que.size();
            int max = Integer.MIN_VALUE;
            for(int i=0;i<size;i++){
                TreeNode node = que.poll();
                //记录每行的最大值
                max = Math.max(max,node.val);
                if(node.left != null){
                    que.add(node.left);
                }
                if(node.right != null){
                    que.add(node.right);
                }
            }
            result.add(max);
        }
        return result;
    }
}

在这里插入图片描述

4、二叉树的右视图

1.题目描述
  1. 二叉树的右视图

给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
示例:
输入: [1,2,3,null,5,null,4]
输出: [1, 3, 4]
解释:
1 <—
/
2 3 <—
\
5 4 <—

2.思想

二叉树的右视图返回的是存储每一层最右侧节点的值的数组,可以利用层序遍历,每到这一层最右侧的结点的时候记录结点值

3.代码
class Solution {
    public List<Integer> rightSideView(TreeNode root) {
        List<Integer> result = new ArrayList<>();
        Queue<TreeNode> que = new LinkedList<>();
        que.add(root);
        while(que.peek() != null){
            int size = que.size();
            for(int i=0;i<size;i++){
                TreeNode node = que.poll();
                if(i == size-1){
                    result.add(node.val);
                }
                if(node.left != null){
                    que.add(node.left);
                }
                if(node.right != null){
                    que.add(node.right);
                }
            }
        }
        return result;
    }
}

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值