剑指offer之按之字形顺序打印二叉树(Java实现)

按之字形顺序打印二叉树

NowCoder

题目描述:

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

解题思路:

 按之字形顺序打印二叉树需要两个栈。我们在打印某一行结点时,把下一层的子结点保存到相应的栈里。如果当前打印的是奇数层,则先保存左
 子结点再保存右子结点到一个栈里;如果当前打印的是偶数层,则先保存右子结点再保存左子结点到第二个栈里。

import java.util.*;

public class Solution {
    public ArrayList<ArrayList<Integer> > Print(TreeNode ppRootOfTree) {
        ArrayList<ArrayList<Integer>> arrayListAllLevel = new ArrayList<>();
        if (ppRootOfTree == null)     return arrayListAllLevel;
        //stack1暂存奇数层结点
        Stack<TreeNode> stack1 = new Stack<>();
        //stack2暂存偶数层结点
        Stack<TreeNode> stack2 = new Stack<>();
        //初始层为第一层
        int level = 1;
        //将第一层的结点按从左到右的顺序入栈
        stack1.push(ppRootOfTree);
        
        while (!stack1.isEmpty() || !stack2.isEmpty()){
            //保存该层中栈的元素
            ArrayList<Integer> arrayListlevel = new ArrayList<>();
            //判断是哪一个栈进行出栈操作
            if (level % 2 == 1){
                //当奇数层执行出栈操作时  
                //如果stack1还存在元素,则继续出栈  
                while ( !stack1.isEmpty()){
                    TreeNode node = stack1.pop();
                    //在出栈的同时,将此节点的左右子节点入stack2  
                    //同时存入另一个栈的顺序是先存左子节点,再存右子节点 
                    arrayListlevel.add(node.val);
                    if (node.left != null)   stack2.push(node.left);
                    if (node.right != null)  stack2.push(node.right);
                }
                level ++;
                 //stack1中所有元素出栈完毕后,将奇数层次的所有元素加入到整个线性表中  
                 arrayListAllLevel.add(arrayListlevel);  
            }else {
                //stack2执行出栈操作  
                //当偶数层执行出栈操作时  
                //如果stack2还存在元素,则继续出栈  
                while ( !stack2.isEmpty()){
                    TreeNode node = stack2.pop();
                    //出栈同时加入到奇数层次的数组中
                    arrayListlevel.add(node.val);
                    //在出栈的同时,将此节点的左右子节点入stack1  
                    //同时存入另一个栈的顺序是先存右子节点,再存左子节点  
                    if (node.right != null)  stack1.push(node.right);
                    if (node.left != null)   stack1.push(node.left);
                }
                level ++;
                //stack2中所有元素出栈完毕后,将偶数层次的所有元素加入到整个线性表中  
                arrayListAllLevel.add(arrayListlevel);
            }
        }
        return arrayListAllLevel;
    }
}

你可能感兴趣的:(剑指offer)