按之字形顺序打印二叉树

按之字形顺序打印二叉树

按之字形顺序打印二叉树

image-20220623090136416

  • 我们可以借助队列先进先出的特性,实现层序保存!

  • 然后通过flg标志位,尾插到结果数组中就是顺序打印,头插到结果数组中就实现了逆序打印!

  • 注意这里通过入改变入队的顺序实现之字形不现实,做不到!!!!

    alt

    通过记录结果时实现翻转!

 //方法一:利用队列!
public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
        Queue<TreeNode> queue = new LinkedList<>();
        ArrayList<ArrayList<Integer>> result = new ArrayList<>();
        if(pRoot==null) return result;
        queue.offer(pRoot);
        boolean flg = false;//左右顺序入tmp!
        while(!queue.isEmpty()){
            int size = queue.size();
            flg = !flg;//改变打印顺序!   注意:改变入队顺序做不到
            ArrayList<Integer> tmp = new ArrayList<>();
            while(size-->0){
                TreeNode cur = queue.poll();
                if(flg){
                    //顺序打印!
                    tmp.add(cur.val);
                }else{//头插,实现逆序!
                    tmp.add(0,cur.val);
                }
                if(cur.left!=null){
                     queue.offer(cur.left);
                  }
                if(cur.right!=null){
                     queue.offer(cur.right);
                  }
            }
           if(!tmp.isEmpty()){
               result.add(tmp);
           }
        }
        return result;
    }

时间复杂度O(N),空间复杂度O(N)


  • 我们刚刚想通过改变入队顺序,从而改实现反转未能实现,是由于队列是先进先出,就算改变了入队顺序,也只是改变了子树内部的反转,并没有改变全部反转
  • 所以我们可以借助栈先进后出的特点实现刚刚的反转!
  • 这里需要借助两个栈,一个用来

  • 通过两个栈倒来倒去实现之字形打印!
  • 我们将根节点入stack1,将stack1出栈并且保存,然后stack1栈中的子节点顺序入栈到stack2,利用先进后出的特点,当stack2出栈保存结果时,就实现了逆序存放!
  • stack2中的节点出栈,在将其子节点按照先右后左入栈,也就实现了stack1的顺序保存!
//方法二:通过两个栈实现!
  public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
        ArrayList<ArrayList<Integer>> result = new ArrayList<>();
        if(pRoot==null) return result;
        Stack<TreeNode> stack1 = new Stack<>();
        stack1.add(pRoot);//先将根节点入栈!
        Stack<TreeNode> stack2 = new Stack<>();
        while(!stack1.isEmpty()||!stack2.isEmpty()){
            ArrayList<Integer> tmp = new ArrayList<>();
            if(!stack1.isEmpty()){
             //不为空,就将该节点的左右节点左右顺序入stack2
             //左右顺序入栈,出栈时就实现了先右后左打印!
              while(!stack1.isEmpty()){
                 TreeNode cur = stack1.pop();
                 if(cur.left!=null){
                     stack2.add(cur.left);
                 }
                 if(cur.right!=null){
                     stack2.add(cur.right);
                 }
                 tmp.add(cur.val);
             }
            }else{
             //说明stack2不为空,就将 stack2中的节点的子节点入栈到stack1
             //根据上一层的入栈顺序,先左后右,顺序入栈,就要逆序出栈,实现了逆序打印!
             //这里要实现下一层的顺序打印(顺序出栈),所以这里要逆序入栈,先右后左入栈!
               while(!stack2.isEmpty()){
                 TreeNode cur = stack2.pop();
                 if(cur.right!=null){
                     stack1.add(cur.right);
                 }
                if(cur.left!=null){
                     stack1.add(cur.left);
                 }
                 tmp.add(cur.val);
             }
            }
           if(!tmp.isEmpty()){
                result.add(tmp);
            }   
         }
        return result; 
    }
#笔试#
全部评论
优秀的人,做什么都是简单的
1 回复 分享
发布于 2022-08-28 11:49 河南

相关推荐

去B座二楼砸水泥地:不过也可以理解,这种应该没参加过秋招
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
11-07 20:21
签耀等华
算法功成师:我咋那么想举办你呢,铁铁
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务