leetcode----103. Binary Tree Zigzag Level Order Traversal

链接:

https://leetcode.com/problems/binary-tree-zigzag-level-order-traversal/

大意:

以‘Z’字形按层次遍历打印二叉树的节点值。例子:

思路:

与上一题思路一样,只不过需要加一个判断当前是从左往右遍历还是从右往左遍历。

这里我使用了个小技巧:构建的是一个链表tmp存储节点值。如果当前层为奇数层(根节点为第一层),则从左往右遍历,即使用尾插法往tmp插入元素;如果当前层为偶数层,则使用头插法往tmp插入元素。

代码:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
        List<List<Integer>> res = new ArrayList<>();
        if (root == null)
            return res;
        LinkedList<TreeNode> queue = new LinkedList<>();
        TreeNode l = root, ll = root; // l为当前加入到队列的最后一个元素  ll为上一层的最末尾元素
        queue.addLast(root);
        int layer = 1; // 奇数层为从左往右遍历  偶数层为从右往左遍历
        LinkedList<Integer> tmp = new LinkedList<>();
        while (!queue.isEmpty()) {
            TreeNode node = queue.removeFirst();
            // 相当于 layer % 2
            if ((layer & 1) == 1)
                tmp.addLast(node.val);
            else 
                tmp.addFirst(node.val);
            if (node.left != null) {
                queue.addLast(node.left);
                l = node.left;
            }
            if (node.right != null) {
                queue.addLast(node.right);
                l = node.right;
            }
            if (node == ll) {
                res.add(new ArrayList<>(tmp));
                tmp = new LinkedList<>();
                ll = l;
                layer++;
            }
        }
        return res;
    }
}

结果:

结论:

效率并不是太高。 

最佳:(递归实现)

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
        List<List<Integer>> result = new ArrayList<List<Integer>> ();
        helper(root, 0, result);
        return result;
    }
    
    public void helper(TreeNode root, int height, List<List<Integer>> result) {
        if (root == null) {
            return;
        }
        if (height == result.size()) {
            result.add(new ArrayList<Integer> ());
        }
        if (height % 2 == 0) {
            result.get(height).add(root.val);
        } else {
            result.get(height).add(0, root.val);
        }
        helper(root.left, height + 1, result);
        helper(root.right, height + 1, result);
    }
}

 

猜你喜欢

转载自blog.csdn.net/smart_ferry/article/details/89204532
今日推荐