LeetCode解题之102.Binary Tree Level Order Traversal(Java)

题目描述:

102. Binary Tree Level Order Traversal

Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, level by level).

For example:
Given binary tree [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7

return its level order traversal as:

[
  [3],
  [9,20],
  [15,7]
]

二叉树的层次遍历是典型的广度优先遍历BFS的应用,层次遍历就是先访问二叉树的第一层,再访问第二层、第三层.....在这里就是需要用一个queue把每一层的数据存储下来,首先把根节点放进去,把根节点的值记录下来,然后让根节点出队,然后找根节点的左右两个子节点,我们还需要做的就是维护一个当前层节点数目,和下一层节点数目,以及当前层的遍历结果,加入结果集。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public List> levelOrder(TreeNode root) {
        
        List> res = new ArrayList<>();  //结果集
        if(root == null)
            return res;
    
        Queue q = new LinkedList<>();   //先进先出的队列
        ArrayList temp = new ArrayList<>();  //用来记录存放当前层的结点
        q.offer(root);  //首先让根节点入队
        int curnode = 1;  //当前层结点数目 初值为1 是根节点的初始化
        int nextnode = 0;  //下一层节点数目
        while(!q.isEmpty()){
            TreeNode node;
            node = q.poll();  //出队
            temp.add(node.val);
            curnode--;
            if(node.left != null){
                q.offer(node.left);  //左子节点入队
                nextnode++; //下一层节点数+1
            }
            if(node.right != null){
                q.offer(node.right);  // 右子节点入队
                nextnode++;  
            }
            if(curnode == 0){  //说明当前层已遍历完
                curnode = nextnode;  
                nextnode = 0;
                res.add(temp);  //加入结果集
                temp = new ArrayList<>();
            }   
        }
        return res;
    }
}

这里补充一下java的queue:

 Queue:一个队列就是一个先入先出(FIFO)的数据结构

两个基本操作:在队尾加入一个元素和队首删除一个元素

几个方法:

1.offer,add区别:
一些队列有大小限制,因此如果想在一个满的队列中加入一个新项,多出的项就会被拒绝。
这时新的 offer 方法就可以起作用了。它不是对调用 add() 方法抛出一个 unchecked 异常,而只是得到由 offer() 返回的 false。

2.poll,remove区别:
remove() 和 poll() 方法都是从队列中删除第一个元素(head)。remove() 的行为与 Collection 接口的版本相似,
但是新的 poll() 方法在用空集合调用时不是抛出异常,只是返回 null。因此新的方法更适合容易出现异常条件的情况。

3.peek,element区别:
element() 和 peek() 用于在队列的头部查询元素。与 remove() 方法类似,在队列为空时, element() 抛出一个异常,而 peek() 直接返回 null
 

你可能感兴趣的:(LeetCode)