- 题目大意:
给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。
例如:
给定二叉树: [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回其层次遍历结果:
[
[3],
[9,20],
[15,7]
]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-level-order-traversal
这个用递归很容易实现,下面详解一下非递归实现。
既然是层级遍历,自然需要队列。
核心思想与步骤:
- 在循环外将当前层级的节点入队(也就是入队root节点)
- 进入循环(比如while循环),遍历队列的节点,将每一个节点出队的同时,入队他的子节点。
- 只要执行完第二步,队列还不为空,则重复第二步,否则退出循环。
至此问题解决。
代码如下:
/**
* 层级打印
*/
public List<List<Integer>> levelOrder(TreeNode root){
if(root == null){
return new ArrayList<>();
}
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);//入队根节点
List<List<Integer>> result = new ArrayList<>();
while (!queue.isEmpty()){//判断队列是否为空
//不为空,执行第二步
int count = queue.size();
List<Integer> list = new ArrayList<>();
for(int i = 0; i < count; i ++){
TreeNode poll = queue.remove();
list.add(poll.val);
if(poll.left != null){
queue.add(poll.left);
}
if(poll.right != null){
queue.add(poll.right);
}
}
result.add(list);
}
return result;
}
问题解决。
贴一下执行效率