剑指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;
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值