二叉树的层次遍历2
二叉树的层次遍历,定义一个新的 TreeLevelNode 类记录当前节点属于哪一层。
初始化时,层数为0,并且将根节点赋值为第1层元素,再入队列。
出队列时,判断如果是新的一层的元素,则创建 list,并且半当前层数切换到新的层数。否则,list 不变,直接添加当前层的元素。
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
if(root == null){
return Collections.emptyList();
}
List<List<Integer>> result = new ArrayList<>();
levelOrder(root, result);
return result;
}
private void levelOrder(TreeNode root, List<List<Integer>> result){
Queue<TreeLevelNode> queue = new LinkedList<>();
TreeLevelNode levelRoot = new TreeLevelNode(root, 1);
//init
queue.offer(levelRoot);
int level = 0;
List<Integer> newLevelList = null;
while(!queue.isEmpty()){
TreeLevelNode current = queue.poll();
int nodeLevel = current.getLevel();
if(nodeLevel > level){
//用来保存新的一层元素
newLevelList = new LinkedList<>();
//
level = nodeLevel;
//创建了一个list 保存新的一层的元素,这一层的list对象 add 到 result。
result.add(newLevelList);
}
newLevelList.add(current.node.val);
if(current.node.left != null){
queue.offer(new TreeLevelNode(current.node.left, nodeLevel+1));
}
if(current.node.right != null){
queue.offer(new TreeLevelNode(current.node.right, nodeLevel+1));
}
}
}
private static class TreeLevelNode{
int level;
TreeNode node;
public TreeLevelNode(TreeNode node, int level){
this.node = node;
this.level = level;
}
public int getLevel(){
return level;
}
}
}
参考文档:二叉树的层序遍历算法实现