题解 | #按之字形顺序打印二叉树#

按之字形顺序打印二叉树

http://www.nowcoder.com/practice/91b69814117f4e8097390d107d2efbe0

按之字形顺序打印二叉树

描述

给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替)

例如:

给定的二叉树是{1,2,3,#,#,4,5}

思路

用栈实现,考察二叉树的层次遍历。用两个栈分别存放奇数层和偶数层的节点,当奇数层栈弹出节点的时候将该节点的左、右节点先后压入偶数层的栈中,一直循环直至奇数层栈没有节点。再从偶数层栈中弹出节点,将该节点的右、左节点先后压入奇数层栈中,循环直至偶数层栈没有节点。反复循环直至所有节点都弹出,则遍历完所有节点。

    public ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {
        //创建目标数组
        ArrayList<ArrayList<Integer>> list = new ArrayList<>();
        //安全性检测
        if (pRoot == null) {
            return list;
        }
        //奇数层栈,从左向右
        Stack<TreeNode> left = new Stack<>();
        //偶数层栈,从右向左
        Stack<TreeNode> right = new Stack<>();
        //奇数层栈中放入根节点
        left.push(pRoot);
        //遍历两个栈直至两个栈都为空,则输出完毕。
        while (!left.isEmpty() || !right.isEmpty()) {
            //当奇数层栈非空时
            if (!left.isEmpty()) {
                //创建层次数组
                ArrayList<Integer> arrayList = new ArrayList<>();
                //遍历奇数层栈直至为空
                while (!left.isEmpty()) {
                    //弹出栈得到当前节点
                    TreeNode node = left.pop();
                    //判断该节点的左节点是否为空
                    if (node.left!=null) {
                        //将该节点的左节点加入到右链表中。
                        right.push(node.left);
                    }
                    //判断该节点的右节点是否为空
                    if (node.right!=null) {
                        //将该节点的右节点加入到右链表中。
                        right.push(node.right);
                    }
                    //向层次数组中加入该节点的值
                    arrayList.add(node.val);
                }
                //向目标数组加入层次数组
                list.add(arrayList);
            }
            //当偶数层栈非空时
            if (!right.isEmpty()) {
                //创建层次数组
                ArrayList<Integer> arrayList = new ArrayList<>();
                //遍历偶数层栈直至为空
                while (!right.isEmpty()) {
                    //弹出栈得到当前节点
                    TreeNode node = right.pop();
                    //判断该节点的右节点是否为空
                    if (node.right!=null) {
                        //将该节点的右节点加入到右链表中。
                        left.push(node.right);        
                    }
                    //判断该节点的左节点是否为空
                    if (node.left!=null) {
                        //将该节点的左节点加入到右链表中。
                        left.push(node.left);
                    }
                    //向层次数组中加入该节点的值
                    arrayList.add(node.val);
                }
                //向目标数组加入层次数组
                list.add(arrayList);
            }
        }
        return list;
    }

    public class TreeNode {
        int val = 0;
        TreeNode left = null;
        TreeNode right = null;

        public TreeNode(int val) {
            this.val = val;
        }
    }
全部评论

相关推荐

迷茫的大四🐶:都让开,我tm来啦
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务