zoukankan      html  css  js  c++  java
  • 剑指Offer59:按之字形顺序打印二叉树(Java)

    参考“牛客408964号”牛客解答:https://www.nowcoder.com/questionTerminal/91b69814117f4e8097390d107d2efbe0?f=discussion

    思路分析:

    利用栈先进后出的特性
    偶数层 往栈以先右后左的顺序压入,当奇数层从栈中取值时得到的顺序时由左向右
    奇数层 往栈以先左后右的顺序压入,当偶数层从栈中取值时得到的顺序时由右向左

    题目描述

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

    Java代码:

    import java.util.ArrayList;
    import java.util.Stack;
    public class Solution {
        public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
        Stack<TreeNode> s1=new Stack<>();
        Stack<TreeNode> s2=new Stack<>();
        ArrayList<ArrayList<Integer>> res=new ArrayList<ArrayList<Integer>>();
        s1.push(pRoot);
        int layer=1;
            while(!s1.empty()||!s2.empty()){
                if(layer%2!=0){//奇数层,从s1取值遍历,孩子节点按照先左后右的顺序压入s2
                    ArrayList<Integer> tmp=new ArrayList<Integer>();
                    while(!s1.empty()){//把一个栈遍历完了,也就是等同于遍历了一层二叉树
                        TreeNode node=s1.pop();
                        if(node!=null){
                            tmp.add(node.val);//需要判断node的空与否,否则会报空指针
                            s2.push(node.left);
                            s2.push(node.right);
                        }
                    }
                    if(!tmp.isEmpty()){//注意判空,当是时是tmp是空的,会被添加进最后结果集。
                        res.add(tmp);
                        layer++;
                    }
                }else{//偶数层,从s2取值遍历,孩子节点按照先右后左的顺序压入s1
                    ArrayList<Integer> tmp=new ArrayList<Integer>();
                    while(!s2.empty()){
                        TreeNode node=s2.pop();
                        if(node!=null){
                            tmp.add(node.val);
                            s1.push(node.right);
                            s1.push(node.left);
                        }
                    }
                    if(!tmp.isEmpty()){
                        res.add(tmp);
                        layer++;
                    }
                }
            }
            return res;
        }
    }
    
  • 相关阅读:
    在Vue.js中使用Stylus预处理器
    前端面试问题(JavaScript)
    前端面试问题(CSS3)
    前端面试问题(HTML5+Http+web)
    VUE2中文文档:组件基础篇
    VUE2中文文档:语法基础笔记
    transition动画效果初识(实例)
    Centos5.2升级openssh7.4p1
    解决python升级导致pip无法使用
    使用jenkins时因为脚本权限问题执行项目失败
  • 原文地址:https://www.cnblogs.com/dongmm031/p/12327840.html
Copyright © 2011-2022 走看看