【D1】二叉树的层序遍历(LC 102 &107)

最近做什么事情都觉得成就感好低=.= 我决定向小姐妹学习,把刷算法题的过程记录下来。

102. 二叉树的层序遍历

问题描述

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

解题思路

使用辅助数据结构队列实现二叉树的广度优先遍历
1.将根节点入队
2.循环执行以下操作,直至队列为空

  • 将队头节点A出队,进行访问
  • 将A的左子节点入队
  • 将A的右子节点入队

Java中队列Queue的常用方法

add: 增加一个元素。如果队列已满,则抛出IIIegaISlabEepeplian异常
remove: 移除并返回队列头部的元素。如果队列为空,则抛出NoSuchElementException异常
offer: 添加一个元素并返回true。 如果队列已满,则返回false
poll: 移除并返问队列头部的元素。 如果队列为空,则返回null
peek: 返回队列头部的元素。 如果队列为空,则返回null
put: 添加一个元素。 如果队列满,则阻塞
take: 移除并返回队列头部的元素。 如果队列为空,则阻塞

代码实现

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> res = new LinkedList<>();
        Queue<TreeNode> q = new LinkedList<TreeNode>();
        if (root != null) {
            //根节点入队
            q.offer(root);
        }

        while(!q.isEmpty()){
            //level数组存储每一层节点的值
            int size = q.size();
            List<Integer> level = new ArrayList<>();
            for(int i = 0 ; i < size; i++){
                //队头节点出队
                TreeNode A = q.poll();
                level.add(A.val);
                //左子节点入队
                if(A.left != null){
                    q.offer(A.left);
                }
                //右子节点入队
                if(A.right != null){
                    q.offer(A.right);
                }
            }
            res.add(level);
        }
        return res;       
    }
}

107. 二叉树的层序遍历 II

问题描述

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

解题思路

总体思路与上一题无异,最后将结果数组进行反转即可。
数组反转可以使用java工具类java.util.Collections中的自带方法Collections.reverse()

代码实现

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public List<List<Integer>> levelOrderBottom(TreeNode root) {
         List<List<Integer>> res = new LinkedList<>();
        Queue<TreeNode> q = new LinkedList<TreeNode>();
        if (root != null) {
            //根节点入队
            q.offer(root);
        }

        while(!q.isEmpty()){
            //level数组存储每一层节点的值
            int size = q.size();
            List<Integer> level = new ArrayList<>();
            for(int i = 0 ; i < size; i++){
                //队头节点出队
                TreeNode A = q.poll();
                level.add(A.val);
                //左子节点入队
                if(A.left != null){
                    q.offer(A.left);
                }
                //右子节点入队
                if(A.right != null){
                    q.offer(A.right);
                }
            }
            res.add(level);
        }
        //反转结果数组
        Collections.reverse(res);
        return res;     
    }
}

推荐阅读更多精彩内容