【剑指Offer】77.按之字形顺序打印二叉树

题目

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

数据范围:0≤n≤1500,树上每个节点的val满足 ∣val∣<=1500
要求:空间复杂度:O(n),时间复杂度:O(n)

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

【剑指Offer】77.按之字形顺序打印二叉树_第1张图片


该二叉树之字形层序遍历的结果是[[1],[3,2],[4,5]]

示例1

输入:{1,2,3,#,#,4,5}

返回值:[[1],[3,2],[4,5]]

说明:如题面解释,第一层是根节点,从左到右打印结果,第二层从右到左,第三层从左到右。

示例2

输入:{8,6,10,5,7,9,11}

返回值:[[8],[10,6],[5,7,9,11]]

示例3

输入:{1,2,3,4,5}

返回值:[[1],[3,2],[4,5]]

解答

源代码

/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 *   public TreeNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param pRoot TreeNode类 
     * @return int整型ArrayList>
     */
    public ArrayList> Print (TreeNode pRoot) {
        // write code here
        if (pRoot == null) {
            return new ArrayList>();
        }
        Deque stack = new ArrayDeque<>();
        stack.add(pRoot);
        int depth = 0;
        ArrayList> res = new ArrayList<>();

        while (!stack.isEmpty()) {
            depth++;
            int length = stack.size();
            Deque temp = new ArrayDeque<>();

            while (length-- > 0) {
                TreeNode node = stack.pollFirst();
                if (node.left != null) {
                    stack.offerLast(node.left);
                }
                if (node.right != null) {
                    stack.offerLast(node.right);
                }
                temp.offerLast(node.val);
            }

            ArrayList floor = new ArrayList<>();
            if (depth % 2 == 1) {
                while (!temp.isEmpty()) {
                    floor.add(temp.pollFirst());
                }
                res.add(floor);
            } else {
                while (!temp.isEmpty()) {
                    floor.add(temp.pollLast());
                }
                res.add(floor);
            }
        }

        return res;
    }
}

总结

广度优先遍历二叉树,用队列存储结点。把每一层的结点用双端队列保存起来,如果是奇数层就顺序记录结果,如果是偶数层就倒序记录结果。

你可能感兴趣的:(剑指Offer,java,数据结构,算法)