剑指 Offer 32 - I. 从上到下打印二叉树
思路
层次遍历
代码
public int[] levelOrder(TreeNode root) {
if(root==null)return new int[0];
List<Integer> list=new ArrayList<>();
Queue<TreeNode> q=new LinkedList<>();
q.add(root);
while(!q.isEmpty()){
TreeNode r=q.poll();
list.add(r.val);
if(r.left!=null)q.add(r.left);
if(r.right!=null)q.add(r.right);
}
int[] res = new int[list.size()];
for(int i = 0; i < list.size(); i++)
res[i] = list.get(i);
return res;
}
剑指 Offer 32 - II. 从上到下打印二叉树 II
思路
多套一层遍历
代码
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> res=new ArrayList<>();
if(root==null)return res;
Queue<TreeNode> q=new LinkedList<>();
q.add(root);
while(!q.isEmpty()){
List<Integer> tmp=new ArrayList<>();
for(int i=q.size();i>0;i--){
TreeNode p=q.poll();
tmp.add(p.val);
if(p.left!=null)q.add(p.left);
if(p.right!=null)q.add(p.right);
}
res.add(tmp);
}
return res;
}
剑指 Offer 32 - III. 从上到下打印二叉树 III
思路
根据当前层数来判断遍历方向,addLast和addFirst
代码
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> res=new ArrayList<>();
if(root==null)return res;
Queue<TreeNode> q=new LinkedList<>();
q.add(root);
while(!q.isEmpty()){
LinkedList<Integer> tmp=new LinkedList<>();
for(int i=q.size();i>0;i--){
TreeNode p=q.poll();
if(res.size()%2==0)tmp.addLast(p.val);
else tmp.addFirst(p.val);
if(p.left!=null)q.add(p.left);
if(p.right!=null)q.add(p.right);
}
res.add(tmp);
}
return res;
}