Toasobi
从上打印二叉树2(中等)
本文最后更新于2023年03月16日,已超过660天没有更新。如果文章内容或图片资源失效,请留言反馈,我会及时处理,谢谢!
- 这题上一题是从上至下打印二叉树,其实就是层序遍历,**这题多了一个偶数高度的数组要逆转。**
上面是上一题的图。虽然是层序遍历,但是要求是每一层的数据都要一个list存储。所以这两道题的难点之一就是如何知道哪些数据是在同一个高度的,并将这些数据放入各个list中。而第二个难点就是逆转数组了
对于如何知道数据是否在一个高度,我一开始的想法是用hashmap,key值存储高度,value存储数据。但是由于hashmap的key值不能重复只能就此作罢。我甚至想到了使用2的指数表示每一层的元素个数,同时使用一个int记录该层缺失多少元素。但是由于该层缺失多少元素非常难求,这个方法在只有一条线的二叉树面前直接寄掉了;;
最后是题解给我的启发,在每次对队列添加完一层的元素后使用队列的长度作为for循环的临界值,每次for循环完成后表示一层的数据都遍历完成,在for循环中每遍历一个添加至一个list中,最后放入大list中,并重新new list()将list全部重置。
代码如下:
<div>/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
int height = 1; //树的高度
List<List<Integer>> array = new ArrayList<>(); //返回结果
if (root == null) {
return array;
}
LinkedList<TreeNode> queue = new LinkedList<>(); //队列
queue.push(root); //头结点放入
while(!queue.isEmpty()){ //队列不为空
int currentSize = queue.size();
List<Integer> ans = new ArrayList<>(); //返回子结果
for(int i=0;i<currentSize;i++){
TreeNode treeNode = queue.removeLast();//出队
ans.add(treeNode.val); //放入list
if(treeNode.left != null){
queue.push(treeNode.left);
}
if(treeNode.right != null){
queue.push(treeNode.right);
}
}
if(height % 2 == 0){
Collections.reverse(ans);
}
array.add(ans);
ans = new ArrayList<>(); //重置list
height++; //层数加一
}
return array;
}
}</div>