题干
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
思路
首先思考一下这是对于二叉树的遍历,且是层序遍历(我觉得不用多讲了丫)
但是对于层序遍历而言都是从左到右,我们是如何实现层序遍历的,利用队列实现,每一层都放入到一个队列里面进行拿出来,现在要我们实现之字形,不就是在特殊的行进行判断,先放入到一个栈里面,然后取出来时候就会倒序了鸭。就是层序遍历的一个简单变形,个人觉得树在面试中考到的还蛮多的,基本的遍历一定要烂熟与心,就像是排序算法一样,后期出一个排序算法的部分。
代码
public ArrayList<ArrayList<Integer>> Print(TreeNode root) {
Queue<TreeNode> queue=new LinkedList<TreeNode>();
Stack<Integer> stack=new Stack<Integer>();
ArrayList<ArrayList<Integer>> arrays=new ArrayList<ArrayList<Integer>>();
ArrayList<Integer> array=new ArrayList<Integer>();
int j=1;
if(root==null)return arrays;
queue.offer(root);
// array.add(root.val); 如何进行表示表示他们是在同一层 是个问题的关键所在 这一点想不出来啊有点 可以利用for循环来实现
while(queue.size()!=0){
int len=queue.size();
for(int i=0;i<len;i++){
TreeNode temp=queue.poll();
if(temp.left!=null){
queue.add(temp.left);
}
if(temp.right!=null){
queue.add(temp.right);
}
if(j%2==0){
stack.push(temp.val);
if(i==len-1){
while(!stack.isEmpty()){
int p=stack.pop();
array.add(p);
}
}
}
else{
array.add(temp.val);
}
}
j++;
arrays.add(array);
array=new ArrayList<Integer>();
}
return arrays;
}