剑指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;
    }
}
posted @ 2020-02-18 20:34  31楼下小黑  阅读(106)  评论(0编辑  收藏  举报