这道题是我司小伙伴进公司面试遇到的一道题,也是力扣热题之一,难度中等,题目如下
二叉树是常见的数据结构之一,一般我们遇到的都是二叉树的 前序(先序) 中序 后续 这三种遍历方式,层序遍历就是一层一层的输出每一层节点的值,看返回的数据结构可知,一个list对象里面包含一个list对象,一个用来存放每一层的节点值,一个是所有层的节点值。
层序遍历思路理解: 用两个linkedlist对象,存在树的节点,一个是树的头节点,一个是树的左右节点, 每次取头节点放到 list 对象中,头节点获取完毕后,再把树的左右节点赋值给头节点,再次进行遍历,比如以下树:
首先头节点 queue1 有完整的树 (1,3,5,7,9,11,13)第一次循环,把 1放到 list中 queue2 中有两颗树 (3,7,9 | 5,11,13)tmp 等于 queue1 等于空 ,queue1 等于 queue2 (3,7,9 | 5,11,13) queue2 等于 tmp 等于空。
第二次循环, queue1 中有两颗树 (3,7,9 | 5,11,13)内层while循环 第一次 取出 3 放到 list中 queue2 放入两棵树(7 9)第二次 取出 5 放到 list中 queue2 放入两棵树(11 13),此时queue2 中有四颗树 (7 9 11 13)tmp 等于 queue1 等于空 ,queue1 等于 queue2 (7 9 11 13) queue2 等于 tmp 等于空。
第三次循环, queue1 中有四颗树 (7 9 11 13)内层while循环 第一次 取出 7 放到 list中, queue1 7 没有左右节点,因此 queue2 还是空,内层第二次 取出 9 放到 list中,同样queue1 9 没有左右节点,因此 queue2 还是空,内层第三次 取出 11 放到 list中,同样queue1 11 没有左右节点,因此 queue2 还是空,内层第四次 取出 13 放到 list中,同样queue1 13 没有左右节点,因此 queue2 还是空,tmp 等于 queue1 等于空 ,queue1 等于 queue1 等于空 queue1 等于 tmp 等于空。
第四次循环 queue1 为空结束,每一次循环的一个list数组就是一层数据,这样既可
package com.example.demo.test;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
/**
* @author qiankun.hu
* @version 1.0.0
* @createTime 2021年12月09日 11:23:00
* @Description 树的层序输出
*/
public class Tree {
public static void main(String[] args) {
TreeNode t4 = new TreeNode(7);
TreeNode t5 = new TreeNode(9);
TreeNode t2 = new TreeNode(3,t4,null);
TreeNode t3 = new TreeNode(5,t5,null);
TreeNode t1 = new TreeNode(1,t2,t3);
levelOrder(t1);
}
/**
* 层序遍历
* @param root
* @return
*/
public static List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> res = new ArrayList<>();
if (root==null)
return res;
LinkedList<TreeNode> queue1 = new LinkedList<>(),queue2 = new LinkedList<>();
queue1.offer(root);
while (!queue1.isEmpty()){
List<Integer> item = new ArrayList<>();
while (!queue1.isEmpty()){
TreeNode node = queue1.remove();
item.add(node.val);
if (node.left!=null)
queue2.offer(node.left);
if (node.right!=null)
queue2.offer(node.right);
}
res.add(item);
LinkedList<TreeNode> tmp = queue1;
queue1 = queue2;
queue2 = tmp;
}
return res;
}
static class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode() {}
TreeNode(int val) { this.val = val; }
TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}
}
解题代码来自力扣评论区