《剑指offer》——按之字形顺序打印二叉树

来源:互联网 发布:MAC上可以玩的游戏 编辑:程序博客网 时间:2024/04/29 19:58

T:

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

这道题目与前几天做的一道题目《把二叉树打印成多行》类似,只不过拿到题目里,把每一层的节点都保存在一个单独数组当中,这道题目中,需要按照“之”字形保存,很简单,用个flag标记一下就能做到。

我的code:

    import java.util.ArrayList;    import java.util.LinkedList;    import java.util.List;    import java.util.Queue;    /*    public class TreeNode {        int val = 0;        TreeNode left = null;        TreeNode right = null;        public TreeNode(int val) {            this.val = val;        }    }    */    /**     * T: 按之字形顺序打印二叉树     *      * 题目描述      * 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,     * 第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。     *      * date: 2015.12.4  14:01     * @author SSS     *     */    public class Solution {        public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {            ArrayList<ArrayList<Integer>> resultsList = new ArrayList<ArrayList<Integer>>();            if (pRoot == null) {                return resultsList;            }            Queue<TreeNode> listQueue = new LinkedList<TreeNode>();            listQueue.add(pRoot);            int preCount = 1;   // 本层的总长度            int curCount = 0;   // 当前已经遍历的个数            int nextCount = 0;  // 下一层的个数计数            // 收集每一层的数组            List<Integer> layerList = new ArrayList<Integer>();            boolean flag = true;    // 正向还是反向收集            while (!listQueue.isEmpty()) {                TreeNode tempNode = listQueue.poll();                layerList.add(tempNode.val);                curCount ++;                if (tempNode.left != null) {                    listQueue.add(tempNode.left);                    nextCount ++;                }                if (tempNode.right != null) {                    listQueue.add(tempNode.right);                    nextCount ++;                }                // 看是否已经遍历完一层了                if (curCount == preCount) {                    preCount = nextCount;                    curCount = 0;                    nextCount = 0;                    ArrayList<Integer> arrList = this.posiOrNegaCollection(layerList, flag);                    // 清空layerList数组                    layerList.clear();                    // 改变flag属性                    if (flag) {                        flag = false;                    } else {                        flag = true;                    }                    resultsList.add(arrList);                }            }            return resultsList;        }        /**         * 正向(反向)收集         * @param layerList         * @param flag         * @return         */        public ArrayList<Integer> posiOrNegaCollection(List<Integer> layerList, boolean flag) {            ArrayList<Integer> arrList = new ArrayList<Integer>();            // 正向            if (flag) {                for (int i = 0; i < layerList.size(); i++) {                    arrList.add(layerList.get(i));                }            } else { // 反向                for (int i = layerList.size() - 1; i > -1; i--) {                    arrList.add(layerList.get(i));                }            }            return arrList;        }    }
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 驾驶证过审一年怎么办 驾照一年未年审怎么办 b驾照年审过期怎么办 摩托车驾驶证过期一年怎么办 驾驶证过期一年半怎么办 驾照过期了几天怎么办 驾照过期超过一年怎么办 考试驾照过期了怎么办 驾校考试过期了怎么办 驾驶证明过期了怎么办 驾驶证年过期了怎么办 驾照过期六个月怎么办 移动预约号码取消怎么办 身份证换地址驾驶证怎么办 刚来成都怎么办居住证 我在外地怎么办身份证 身份证丢在外地怎么办 换领新身份证时旧证丢了怎么办 二代身份证重号怎么办 北京行驶证到期怎么办 北京驾驶证即将过期怎么办 去澳门没有网络怎么办 三个周期未年检怎么办 深圳驾照丢了怎么办 武汉驾照年审过期怎么办 武汉驾照过期了怎么办 科二过不了怎么办 南京身份证到期换新怎么办 过期身份证丢了怎么办 南京驾照过期了怎么办 换驾照身体证明怎么办 学车办理暂住证怎么办 a牌驾照扣分怎么办 b牌驾照扣分怎么办 b驾照扣分了怎么办 考驾照要暂住证怎么办 换驾驶证有色盲怎么办 外籍人员办理就业证怎么办 驾驶证该审过期怎么办 小车证扣满12分怎么办 b证扣满12分怎么办