按之字形打印二叉树
按之字形顺序打印二叉树
http://www.nowcoder.com/questionTerminal/91b69814117f4e8097390d107d2efbe0
1. 双端队列+层次遍历
1.1 分析
- 之字形,要求奇偶层输出顺序相反。
- 双端队列基于LinkedList实现。奇数层,队头出对,孩子从队尾入队,先左后右。偶数层,队尾出队,孩子从队头入队,先右后左。
1.2 代码
import java.util.ArrayList; import java.util.LinkedList; import java.util.Deque; public class Solution { public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) { ArrayList<ArrayList<Integer> > res = new ArrayList<>(); ArrayList<Integer> list = new ArrayList<>(); Deque<TreeNode> dq = new LinkedList<TreeNode>(); if(pRoot == null) return res; dq.offerFirst(pRoot); int thisLevel = 1; int nextLevel = 0; boolean lr = true;//奇偶层标记 while(!dq.isEmpty()){ TreeNode node = null; if(lr == true){//奇术层,队头出对,孩子从队尾入队,先左后右 node = dq.pollFirst(); list.add(node.val); thisLevel--; //左右孩子入队 if(node.left!=null){ dq.offerLast(node.left); nextLevel++; } if(node.right!=null){ dq.offerLast(node.right); nextLevel++; } }else{//偶数层,队尾出队,孩子从队头入队,先右后做 node = dq.pollLast(); list.add(node.val); thisLevel--; //左右孩子入队 if(node.right!=null){ dq.offerFirst(node.right); nextLevel++; } if(node.left!=null){ dq.offerFirst(node.left); nextLevel++; } }//if -else结束 if(thisLevel == 0){ thisLevel = nextLevel; nextLevel = 0; lr = !lr; res.add(list); list = new ArrayList<>(); } }//结束循环 return res; } }
1.3 复杂度
空间:O(n)
时间:O(n)