https://leetcode-cn.com/problems/binary-tree-level-order-traversal-ii/description/
我的解决方案:
我的思路是把二叉树按照层次转换成列表,然后统计每一层有多少个节点,按照层次存储城数组形式,之后按照每层的节点个数对列表进行划分,将结果反转之后返回
class Solution {
public int levelSum(TreeNode root, int level){
if(root==null)
return 0;
if(1==level)
return 1;
else
return levelSum(root.left, level-1)+levelSum(root.right, level-1);
}
public int maxDepth(TreeNode root) {
if(root==null) return 0;
return Integer.max(maxDepth(root.left), maxDepth(root.right))+1;
}
public ArrayList<Integer> treeToArray(TreeNode root) {
ArrayList<Integer> a = new ArrayList<Integer>();
int front=0;
int rear=1;
TreeNode[] q = new TreeNode[10000];
q[front]=root;
a.add(root.val);
int m=10000;
while(front<rear) {
TreeNode p=q[front];
front=(front+1)%m;
if(p.left!=null) {
q[rear]=p.left;
a.add(p.left.val);
rear=(rear+1)%m;
}
if(p.right!=null) {
q[rear]=p.right;
a.add(p.right.val);
rear=(rear+1)%m;
}
}
return a;
}
public List<List<Integer>> levelOrderBottom(TreeNode root) {
List<List<Integer>> res = new LinkedList<List<Integer>>();
if(root==null) return res;
ArrayList<Integer> a = new ArrayList<Integer>();
a=treeToArray(root);
int depth = maxDepth(root);
int[] level = new int[depth+1];
for(int i=1;i<=depth;i++)
level[i]=levelSum(root, i);
System.out.println(a.size());
for(int i=1; i<=depth;i++) {
ArrayList<Integer> tmp = new ArrayList<Integer>();
for(int j=0;j<level[i];j++)
tmp.add(a.remove(0));
res.add(tmp);
}
Collections.reverse(res);
return res;
}
}
参考自提交记录中耗时最短的:
class Solution {
public List<List<Integer>> levelOrderBottom(TreeNode root) {
LinkedList<List<Integer>> l = new LinkedList();
if (root == null) return l;
Queue<TreeNode> q = new LinkedList();
Stack<List<Integer>> s = new Stack();
q.offer(root);
int i = q.size();
List<Integer> list = new LinkedList();
TreeNode p = null;
while(q.size() > 0) {
if (i == 0) {
//这一个if语句的存在,可以将结果分成一层一层的
l.addFirst(list);
i = q.size();
list = new LinkedList();
}
p = q.poll();
list.add(p.val);
--i;
if (p.left != null) q.offer(p.left);
if (p.right != null) q.offer(p.right);
}
l.addFirst(list);
return l;
}
}