題目:請實現一個函數按照之字形打印二叉樹,即第一行按照從左到右的順序打印,第二層按照從右至左的順序打印,第三行按照從左到右的順序打印,其他行以此類推。
解析:在層次遍歷二叉樹的基礎上改變不同行的打印順序
①層次遍歷二叉樹;
②在層次遍歷二叉樹的基礎上對層數進行判斷該層是奇數層還是偶數層;
③奇數層的結點可以直接打印,而偶數層的結點則將其添加到棧中,再出棧打印即爲反序。
public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
ArrayList<ArrayList<Integer>> List = new ArrayList<ArrayList<Integer>>();
if (pRoot == null) return List;
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.add(pRoot);
int count = 1;
while(!queue.isEmpty()){
int size = queue.size();
ArrayList<Integer> list = new ArrayList<Integer>();
Stack<Integer> stack = new Stack<Integer>();
//對每一層(count代表層數)的結點進行打印,同時將下一層的結點添加進隊列中
while (size!=0){
TreeNode node = queue.poll();
if (node.left != null) queue.offer(node.left);
if (node.right != null) queue.offer(node.right);
//奇數層的樹節點從左到右輸出
if (count%2!=0){
list.add(node.val);
}else{
//偶數層的結點壓入棧中
stack.push(node.val);
}
size--;
}
//偶數層的結點出棧打印-----變成反序
if (count%2==0){
while(!stack.isEmpty())
list.add(stack.pop());
}
//將每層的結點全部添加到List中
List.add(list);
count++;
}
return List;
}