剑指offer-按之字形顺序打印二叉树-java

题目描述

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

思路解析

  1. 需要两个栈来辅助输出之字形的二叉树的结点值。
  2. 单数栈是单数行的输出,在出栈的过程中,需要把出栈结点的左右子树放入双数栈中,先左后右,这样输出就是从后向前了
  3. 双数栈是双数行的输出,在出栈的过程中,需要把出栈结点的左右子树放入单数栈中,先右后左
  4. 栈的判空是s1.empty();list的判空是list.isEmpty()

代码

import java.util.ArrayList;
import java.util.Stack;
/*
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/

public class Solution {
    public ArrayList > Print(TreeNode pRoot) {
        int layer = 1;
        ArrayList> listAll = new ArrayList>();
        Stack s1=new Stack();
        s1.push(pRoot);
        Stack s2=new Stack();
        while(!s1.empty()||!s2.empty()){
            if(layer%2!=0){//单数行
                ArrayList list = new ArrayList();
                while(!s1.empty()){//栈不为空就弹出来存入list
                    TreeNode node = s1.pop();
                    if(node!=null){
                        list.add(node.val);
                        s2.push(node.left);
                        s2.push(node.right);
                    }
                }
                if(!list.isEmpty()){
                    listAll.add(list);
                    layer++;
                }
            }else{//双数行
                ArrayList list = new ArrayList();
                while(!s2.empty()){//栈不为空就弹出来存入list
                    TreeNode node = s2.pop();
                    if(node!=null){
                        list.add(node.val);
                        s1.push(node.right);
                        s1.push(node.left);
                    }
                }
                if(!list.isEmpty()){//list不为空,存入listAll
                    listAll.add(list);
                    layer++;
                }
            }
        }
        return listAll;
    }

}

你可能感兴趣的:(牛客,Java,剑指offer,树,在线编程)