每日一题;
昨天有事儿,没做今天补上。
这两道题是一样的,都是把二叉树广搜,输出每层节点,一个是从下往上,一个是从上往下;
我的思路是:
1、建立一个队列(参考别人后想到的),然后把根节点放进去,
2、依次处理队列中的值,如果有左右孩子,就把左右孩子分别加到队列里面,然后把值放进当前层的列表里面;
3、在层与层之间分割的地方集,在队列中加入一个空节点,遇到空节点时,就把当前列表放进结果列表,然后在队列里面加入层分割;
4、在加入结果队列的时候,过滤一下,如果当前层列表是空的就不要加入结果队列了。
5、从上向下和从下向上只需要把当前层加入结果队列时,指定加入的index就可以了。
Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left to right, level by level from leaf to root).
For example:
Given binary tree {3,9,20,#,#,15,7}
,
3 / \ 9 20 / \ 15 7
return its bottom-up level order traversal as:
[ [15,7], [9,20], [3] ]
public static List<List<Integer>> levelOrderTop(TreeNode root) {
if(root==null) new ArrayList<List<Integer>>();
List<List<Integer>> result=new ArrayList<List<Integer>>();
Queue<TreeNode> queue = new LinkedList<TreeNode>();
TreeNode temp ;
ArrayList<Integer> list = new ArrayList<Integer>();
queue.offer(root);
queue.offer(null);
while (queue.size()>0){
temp = queue.poll();
if(temp == null){
if(!list.isEmpty()){
queue.offer(null);
result.add(list);
list = new ArrayList<Integer>();
}
}else {
if(temp.left!=null)
queue.offer(temp.left);
if(temp.right!=null)
queue.offer(temp.right);
list.add(temp.val);
}
}
return result;
}
public static List<List<Integer>> levelOrderBottom(TreeNode root) {
if(root==null) new ArrayList<List<Integer>>();
List<List<Integer>> result=new ArrayList<List<Integer>>();
Queue<TreeNode> queue = new LinkedList<TreeNode>();
TreeNode temp ;
ArrayList<Integer> list = new ArrayList<Integer>();
queue.offer(root);
queue.offer(null);
while (queue.size()>0){
temp = queue.poll();
if(temp == null){
if(!list.isEmpty()){
queue.offer(null);
result.add(0,list);
list = new ArrayList<Integer>();
}
}else {
if(temp.left!=null)
queue.offer(temp.left);
if(temp.right!=null)
queue.offer(temp.right);
list.add(temp.val);
}
}
return result;
}