按之字形顺序打印二叉树

按之字形顺序打印二叉树

按之字形顺序打印二叉树

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 河南

相关推荐

2025年10月3日中午,在写完定时一年后发给自己的信之后,敲下键盘,写下这篇文字。我把标题的“所有人”加了引号,因为如我们所见,确实有的人顺风顺水,每天过的很开心,或是早早进入大厂,或是年纪轻轻就拿到了高薪offer,或是过着可能我努力十年也不一定实现的生活。但也许,不是每个人的痛苦都能被别人看到的,这个月我经常会哭,被骗6000块钱、手上钱不够导致拖欠房租、生活还要借朋友钱、国庆长假也没有钱去旅游,互联网公司不稳定担心试用期不过(毕竟上段实习就是被裁了,一有点风吹草动就害怕),但这样的我,不是所有人都知道的,居然是有些朋友的羡慕对象。回忆我的七年“长跑”别人都是多年幸福的恋爱长跑,我没有恋...
故事和酒66:让每一颗种子找到合适自己的生长方式,最终绽放出独一无二的花朵,这远比所有人都被迫长成同一棵“参天大树”的世界,更加美好和富有生机。这是社会和环境的问题,而不是我们的问题。然而就是在这样的环境中,楼主依然能突破自我,逆势成长,其中的艰辛可想而知。这一路的苦难终究会化作你成长的养料
你小时候最想从事什么职业
点赞 评论 收藏
分享
黑曼巴在线招人:草拟
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务