按之字形顺序打印二叉树

举报
bug郭 发表于 2022/08/28 08:11:03 2022/08/28
【摘要】 按之字形顺序打印二叉树按之字形顺序打印二叉树我们可以借助队列先进先出的特性,实现层序保存!然后通过flg标志位,尾插到结果数组中就是顺序打印,头插到结果数组中就实现了逆序打印!注意这里通过入改变入队的顺序实现之字形不现实,做不到!!!通过记录结果时实现翻转! //方法一:利用队列!public ArrayList<ArrayList<Integer> > Print(TreeNode pR...

按之字形顺序打印二叉树

按之字形顺序打印二叉树

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; 
    }

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。