题目来源
剑指 Offer 32 - II. 从上到下打印二叉树 II - 力扣(LeetCode)
题目
从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。
示例
给定二叉树:[3,9,20,null,null,15,7]
返回其层次遍历结果:
[ [3], [9,20], [15,7] ]
解析:
该题是二叉树层次遍历的另一种形式,要想做出该题,首先要明白层次遍历的原理,下面来复习一下层次遍历:
层次遍历的实现需要借助队列实现,首先将根结点入队,如果队列不为空,则取出队列的队头节点cur,并输出队头节点的值cur.value;然后,若队头节点的左孩子不为空,即cur.left!=null,则将其入队;若队头节点的右孩子不为空,即cur.right!=null,则将其入队;然后循环上述步骤,直至队列为空。
public static void levelOrder(Node root) {
if (root == null) {
return;
}
Queue<Node> queue = new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty()) {
Node cur = queue.poll();
System.out.print(cur.value+" ");
if (cur.left != null) {
queue.offer(cur.left);
}
if (cur.right != null) {
queue.offer(cur.right);
}
}
}
本题是将二叉树的每层以链表的形式输出,但其思想仍然是层次遍历的思想,其具体实现如下:
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> list=new ArrayList<>();
//如果树为空,则返回
if(root==null){
return list;
}
//如果树不为空
//借助队列
Queue<TreeNode> queue=new LinkedList<>();
queue.offer(root);//将根结点入队
while(!queue.isEmpty()){
ArrayList<Integer> arraylist=new ArrayList<>();
int size= queue.size();
for(int i=0;i<size;i++){
TreeNode cur=queue.poll();
arraylist.add(cur.val);
if(cur.left!=null){
queue.offer(cur.left);
}
if(cur.right!=null){
queue.offer(cur.right);
}
}
list.add(arraylist);
}
return list;
}
}