Java集合元素的反转
上午刷了几题Leecode其中107题《二叉树的层序遍历II》
题目链接:二叉树的层序遍历II
这题看输入输出明显是一个要用到集合与二叉树的数据结构的题。
此题的关键在于遍历每层后将节点的值存放在集合中,最后将每层每个集合存放于res集合中。但题目要求从叶子节点层开始遍历保存,而不是从根节点开始。
我的思路是先使用一个函数实现自上向下层序遍历节点并用集合保存,毕竟这还是比较容易实现的。代码如下
public void cx(TreeNode root,List<List<Integer>> res){
LinkedList<TreeNode> que= new LinkedList<>();
if(root!=null){
que.offer(root);
}
while(!que.isEmpty()){
int n=que.size();
List<Integer> path=new ArrayList<>();
for(int i=0;i<n;i++){
TreeNode node =que.poll();
path.add(node.val);
if(node.left!=null){
que.offer(node.left);
}
if(node.right!=null){
que.offer(node.right);
}
}
res.add(path);
}
}
这样就实现了二叉树的普通层序遍历输出,接着我们只要将保存的res集合中的元素(这里也是Integer的一个集合)反转一下就可以得到题目的输出。
集合的反转这里就需要自己造轮子了,下面给出一个效率还可以的一种方法将集合中元素第一个与size()-1交换,第二个与size()-2交换,依次交换下去,这里注意交换需要需要定一个临时的集合来操作。代码如下:
for(int i=0,j=res.size()-1;i<j;i++,j--){
List<Integer> temp= res.get(i);
res.set(i,res.get(j));
res.set(j,temp);
}
一开始以为这种思路可能通过不了或时间复杂度很高,没想到居然效率还行。这可能是得益于集合的反转效率比较高。
上述是本弱鸡的解题的思路,普通人就能想到的,题解中还有很多大佬们双百的题解,直接在二叉树遍历时存储,不需要得到集合再逆序。