問題描述
請實現一個函數按照之字形打印二叉樹,即第一行按照從左到右的順序打印,第二層按照從右至左的順序打印,第三行按照從左到右的順序打印,其他行以此類推。
思路
可以用一個棧。照樣層序遍歷,只不過在倒着走的層用一個棧保存數字,遍歷完了這層再吐出來。
方法一
class Solution {
public ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {
ArrayList<ArrayList<Integer>> res = new ArrayList<>();
if(pRoot == null) return res;
boolean isRight = true; // 表示方向
Queue<TreeNode> queue = new LinkedList<>();
queue.add(pRoot);
while(!queue.isEmpty()){
Queue<TreeNode> next = new LinkedList<>();
ArrayList<Integer> tmp = new ArrayList<>();
Stack<Integer> stack = new Stack<>(); // 倒着來, 當然用棧
while(!queue.isEmpty()){
if(!isRight){
stack.add(queue.peek().val);
}else{
tmp.add(queue.peek().val);
}
if(queue.peek() != null && queue.peek().left != null) next.add(queue.peek().left);
if(queue.peek() != null && queue.peek().right != null) next.add(queue.peek().right);
queue.poll();
}
while(!stack.isEmpty()) tmp.add(stack.pop());
res.add(tmp);
isRight = !isRight;
queue = next;
}
return res;
}
}