前言:(代码里的单词queue,错写成了quene 见谅)
(建议先看test60,这题相当于test60的加强版,这个代码写的真的非常好,逻辑清晰,test60里有分析)
队列是一种特殊的线性表,它只允许再表的前端进行删除操作,在表的后端进行插入操作。在java中,LinkedList类实现了Quene接口,因此我们可以把LinkedList当成Quene来用。
其次,代码中的LinkedList.addLast()和不带索引位置的LinkedList.add()是一样的,即下面代码中都可以换成add()
1.题目:
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
- 思路:没搞定。贴一下牛客网MOON大佬的思路和代码,用到的容器及方法比往常的题目多,也复杂,不像是一个取巧的题目,而是一个具工作量的题目
- 代码:
public class Solution {
public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
ArrayList<ArrayList<Integer> > ret=new ArrayList<>();
if(pRoot==null) return ret;
ArrayList<Integer> list=new ArrayList<>();
LinkedList<TreeNode> quene=new LinkedList<>();
quene.addLast(null);//层数分隔符
quene.addLast(pRoot);
boolean leftToRight=true;
while(quene.size()!=1){
TreeNode node=quene.removeFirst();
if(node==null){//到达层分隔符
Iterator<TreeNode> iter=null;
if(leftToRight){
iter=quene.iterator();//从前往后遍历
}else{
iter=quene.descendingIterator()//从后往前遍历
}
leftToRight=!leftToRight;//反转
while(iter.hasNext()){
TreeNode temp=(TreeNode)iter.next();
list.add(temp.val);
}
ret.add(new ArrayList<Integer>(list));
list.clear();
quene.addLast(null)//插入分割符
continue;//
}
if(node.left!=null) quene.addLast(node.left);
if(node.right!=null) quene.addLast(node.right);
}
return ret;
}
}
class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}