从上到下打印二叉树 II
题目传送门:题目链接
题目大意就是,有一棵二叉树,需要对二叉树进行层次遍历,只不过加了一个条件,那就是要对每一层的数据进行分离,也就是说,要去标记每一层的数据。
最开始的想法,比较简单,那就是使用一个map记录每一个节点的层数,对于根节点,设它的层数为1,对于每一个节点的层数:nowLevel = preLevel + 1,层次遍历二叉树,肯定要用到广搜,二叉树广搜,一般都会在得到当前节点后,将左右子树加入到队列中,我们就可以把记录层数的这个递推操作,加到这个位置,代码比较简单,直接贴出来了
public List<List<Integer>> levelOrder(TreeNode root) {
ArrayList<List<Integer>> results = new ArrayList<List<Integer>>();
//特判空树
if(root == null) {
return results;
}
ArrayList<Integer> result = new ArrayList<Integer>();
HashMap<TreeNode, Integer> level = new HashMap<TreeNode, Integer>();
LinkedList<TreeNode> queue = new LinkedList<TreeNode>();
queue.add(root);
//记录root位于第一层
level.put(root, 1);
int nowLevel = 1;
while(queue.size() > 0) {
TreeNode now = queue.removeFirst();
if(level.get(now) == nowLevel) {
//还在同一层
result.add(now.val);
}else {
//已经跳到下一层了
results.add(result);
result = new ArrayList<Integer>();
result.add(now.val);
nowLevel++;
}
if(now.left != null) {
queue.add(now.left);
level.put(now.left, (level.get(now)+1));
}
if(now.right != null) {
queue.add(now.right);
level.put(now.right, (level.get(now)+1));
}
}
results.add(result);
return results;
}
看了大佬的题解以后,发现了一种更加精妙的做法,主要是分层上,可以查看当前队列的size,这个size就是当前层次的元素个数,取这个size,然后存到一个临时变量tmp,循环取出tmp个元素,并且将这些元素的左右子节点加到队列中(注意此时size确实变化了,但是由于将原始size存到了tmp,所以tmp还是表示当前层次的元素个数),所以代码写出来可以是这样的
//大佬的解法,用一个for循环记录层数
public List<List<Integer>> levelOrder(TreeNode root) {
ArrayList<List<Integer>> results = new ArrayList<List<Integer>>();
if(root == null) {
return results;
}
LinkedList<TreeNode> queue = new LinkedList<TreeNode>();
queue.add(root);
while(queue.size() > 0) {
ArrayList<Integer> result = new ArrayList<Integer>();
for(int i = queue.size(); i > 0; i--) {
TreeNode now = queue.removeFirst();
result.add(now.val);
if(now.left != null) {
queue.add(now.left);
}
if(now.right != null) {
queue.add(now.right);
}
}
results.add(result);
}
return results;
}
学了一个层次遍历的妙招,今天又没白活,哈哈