牛客网刷题之按之字形顺序打印二叉树

来源:互联网 发布:java schedule 编辑:程序博客网 时间:2024/06/01 21:00

题目描述:

这里写图片描述

解题思路:

  这基本是层遍历的思路。但不同的是:由于需要按照之字形打印每一层,所以在打印每一行之前需要判断上一行打印的顺序。如果上一行打印的顺序使从左到右,那么下一行的打印顺序应该是从右到左。实现的这点可以采用奇数行从左到右打印,偶数行从右到左进行打印。还可直接设置 一个布尔变量,每打印一行就改变一次该变量的值。其他的就是层序遍历的思路了。

题解:

public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {            ArrayList<ArrayList<Integer> > res = new ArrayList<>();            if(pRoot == null){                return res;            }            Queue<TreeNode> queue = new LinkedList<>();//存储遍历顺序            queue.add(pRoot);            ArrayList<Integer> list = new ArrayList<>();//存储每一行遍历结果            boolean isLeftToRight = true;            int begin = 0;            int end = 1;            while(! queue.isEmpty()){                TreeNode curNode = queue.poll();                list.add(curNode.val);                begin ++;                if(curNode.left != null){                    queue.add(curNode.left);                }                if(curNode.right != null){                    queue.add(curNode.right);                }                if(begin == end){                    if(! isLeftToRight){                        res.add(reverse(list));                    }else{                        res.add(list);                    }                    isLeftToRight = !isLeftToRight;//下一行改变方向                    end = queue.size();                    begin = 0;                    list = new ArrayList<>();//保存下一行遍历的元素                }            }            return res;        }        private ArrayList<Integer> reverse(ArrayList<Integer> res) {            ArrayList<Integer> reverseList = new ArrayList<>();            for(int i = res.size()-1 ; i >= 0 ; i --){                reverseList.add(res.get(i));            }            return reverseList;        }

ac结果:

这里写图片描述

0 0
原创粉丝点击