package com.myproject.demo.算法;
import java.util.ArrayList;
import java.util.List;
import java.util.Queue;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
/**
* 给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。
* <p>
* <p>
* <p>
* 示例:
* 二叉树:[3,9,20,null,null,15,7],
* <p>
* 3
* / \
* 9 20
* / \
* 15 7
* <p>
* 返回其层次遍历结果:
* <p>
* [
* [3],
* [9,20],
* [15,7]
* ]
*
* @author yuJie
* @since 2020/5/13
*/
public class 二叉树的层序遍历 {
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
public List<List<Integer>> levelOrder(TreeNode root) {
if (root == null) {
return new ArrayList<>();
}
List<List<Integer>> result = new ArrayList<>();
Queue queue = new LinkedBlockingQueue();
List<Integer> first = new ArrayList<>();
first.add(root.val);
result.add(first);
queue.add(root);
while (queue.peek() != null) {
int n = queue.size();
List<Integer> list = new ArrayList<>();
//这个for循环只是为了判断把在同一层的节点存在一起
for (int i = 0; i < n; i++) {
TreeNode node = (TreeNode) queue.poll();
if (node.left != null) {
list.add(node.left.val);
queue.add(node.left);
}
if (node.right != null) {
queue.add(node.right);
list.add(node.right.val);
}
}
if (list.size() > 0) {
result.add(list);
}
}
return result;
}
}