題目
當需要從左到右時,我們需要轉爲棧來使用
當需要從右到左,我們需要轉爲隊列來使用
所以我們可以利用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;
}
代碼可能看起來有點多 但是我覺得邏輯還蠻清晰 貼出來分享一下