题目
当需要从左到右时,我们需要转为栈来使用
当需要从右到左,我们需要转为队列来使用
所以我们可以利用LinkedList
public List<List<Integer>> levelOrder(TreeNode root) {
LinkedList<TreeNode> linkedList = new LinkedList<>();
List<List<Integer>> out = new ArrayList<>();
if (root==null)
return out;
linkedList.add(root);
boolean flag = true; //true表示从左到右 false表示从右到左
while (!linkedList.isEmpty()){
int size = linkedList.size();
List<Integer> list = new ArrayList<>();
while (size>0){
if (flag){ //如果为左到右 那么我们要取最后的结点 先把该结点的左结点添加到最前面 然后把该结点的右节点添加到最前面 此时为栈
TreeNode node = linkedList.pollLast();
if (node.left!=null)
linkedList.addFirst(node.left);
if (node.right!=null)
linkedList.addFirst(node.right);
list.add(node.val);
}else { //如果为右到左 那么我们要取最前的结点 先把该结点的右结点添加到最后面 然后把该结点的左节点添加到最后面 此时为队列
TreeNode node = linkedList.pollFirst();
if (node.right!=null)
linkedList.addLast(node.right);
if (node.left!=null)
linkedList.addLast(node.left);
list.add(node.val);
}
size--;
}
flag = !flag; //下一次的顺序与本次相反
out.add(list);
}
return out;
}
代码可能看起来有点多 但是我觉得逻辑还蛮清晰 贴出来分享一下