[算法练习-剑指offer]题59.按之字形顺序打印二叉树(Java)(层序遍历)

题目

题号:59
题目名:按之字形顺序打印二叉树

编程语言

Java

题目描述

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

初次思路

如果按照层序遍历的思路走,那就是从左往右一次打印结点

题目要求是按之字形打印

也就是第一层从左往右,第二层从右往左,第三次从左往右,第四层从右往左…

就是在层序遍历的基础上,将返回集合的时候,插入顺序改变,奇数的话将结点插在集合末尾,偶数则插在集合开头

重点是要记住层序遍历的模板,运用的是队列的思想.(这里也可以用Queue的实现类)

解题代码

public class Solution {
    public ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {
        /**
         * 之字形打印
         * 层序遍历就是使用队列先进后出的特性
         * 就是层序遍历的基础上,分奇偶性的不同,打印不同的顺序
         * 如果是奇数层,则从左往右打印,如果是偶数,则从右往左打印
         */
        ArrayList<ArrayList<Integer>> res = new ArrayList<>();

        if(pRoot==null) return res;
        LinkedList<TreeNode> doubleList = new LinkedList<>();
        doubleList.add(pRoot);
        int floor = 1;//定义层数
        //如果队列为空说明已经遍历完了
        while(!doubleList.isEmpty()) {
            ArrayList<Integer> list  = new ArrayList<>();
            int size =doubleList.size();//先定义一开始进来时候的结点个数
            while (size>0) {
                TreeNode treeNode = doubleList.removeFirst();//先进先出
                //如果层数是奇数,就往后加,如果是偶数就加载首
                if(floor%2==1) {
                    list.add(treeNode.val);
                }else list.add(0,treeNode.val);
                //出一个结点填一个进去,这个是层序遍历模板
                if(treeNode.left!=null) doubleList.addLast(treeNode.left);
                if(treeNode.right!=null) doubleList.addLast(treeNode.right);
                size -- ;
            }
            res.add(list);
            floor++;
        }
        return res;
    }
}

算法练习代码我都开源在码云上,有需要的朋友可以看看

https://gitee.com/xiaoxiaoyuworkspace/offeralgorithm

你可能感兴趣的:(算法练习,剑指offer,二叉树,层序遍历,队列,牛客网,算法)