剑指Offer五十九: 按之字形顺序打印二叉树

题干

请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。

思路

首先思考一下这是对于二叉树的遍历,且是层序遍历(我觉得不用多讲了丫)
但是对于层序遍历而言都是从左到右,我们是如何实现层序遍历的,利用队列实现,每一层都放入到一个队列里面进行拿出来,现在要我们实现之字形,不就是在特殊的行进行判断,先放入到一个栈里面,然后取出来时候就会倒序了鸭。就是层序遍历的一个简单变形,个人觉得树在面试中考到的还蛮多的,基本的遍历一定要烂熟与心,就像是排序算法一样,后期出一个排序算法的部分。

代码

  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;
    }
发布了84 篇原创文章 · 获赞 53 · 访问量 7385

猜你喜欢

转载自blog.csdn.net/weixin_44015043/article/details/105422372