leetcode 103. Binary Tree Zigzag Level Order Traversal-深度遍历|广度遍历|递归|非递归

来源:互联网 发布:中国电信4g网络覆盖 编辑:程序博客网 时间:2024/04/30 17:35
原题链接:103. Binary Tree Zigzag Level Order Traversal

【思路-Java】bfs、非递归实现

要将二叉树的 zigzag 遍历返回。本思路采用 dfs 实现,实现方法很多,可以用两个栈,第奇数层压入一个栈,然后取出放入集合中,第偶数层压入另一个栈,同样取出放入集合中。另外可以采用可以采用一个队列,一层层地放入集合中,对第奇数层集合进行反转,并将结果放入结果集中:

public class Solution {    public List<List<Integer>> zigzagLevelOrder(TreeNode root) {        List<List<Integer>> res = new ArrayList<List<Integer>>();        Queue<TreeNode> queue = new LinkedList<TreeNode>();        queue.add(root);        boolean right2left = false;        while (!queue.isEmpty()) {            int size = queue.size();            List<Integer> level = new ArrayList<Integer>();            while (size-- > 0) {                root = queue.poll();                if(root != null) {                    level.add(root.val);                    queue.add(root.left);                    queue.add(root.right);                }            }            if (right2left) Collections.reverse(level);            right2left = !right2left;            if(!level.isEmpty()) res.add(level);        }        return res;    }}

33 / 33 test cases passed. Runtime: 2 ms  Your runtime beats 60.36% of javasubmissions.


【思路2-Java】dfs、递归、非递归实现

实际上 dfs 效率并不是很高,先往结果集 res 中加入中间集合 ArrayList,然后再往 ArrayList 中添加元素:

public class Solution {    public List<List<Integer>> zigzagLevelOrder(TreeNode root) {        List<List<Integer>> res = new ArrayList<List<Integer>>();        dfs(root, res, 0);        System.out.println(res);        return res;    }    private void dfs(TreeNode root, List<List<Integer>> res, int level) {        if (root == null) return;        if (res.size() <= level) res.add(new ArrayList<Integer>());        if (level % 2 == 0) res.get(level).add(root.val);        else res.get(level).add(0, root.val);        dfs(root.left, res, level+1);        dfs(root.right, res, level+1);    }}
33 / 33 test cases passed. Runtime: 7 ms  Your runtime beats 2.11% of javasubmissions.

    public List<List<Integer>> zigzagLevelOrder(TreeNode root) {        List<List<Integer>> res = new ArrayList<List<Integer>>();        HashMap<TreeNode, Integer> hm = new HashMap<>();        hm.put(root, 0);        Stack<TreeNode> stack = new Stack<>();        stack.add(root);        while (!stack.isEmpty()) {            root = stack.pop();            if (root != null) {                int level = hm.get(root);                if (level == res.size()) res.add(new ArrayList<Integer>());                if (level % 2 == 0) res.get(level).add(root.val);                else res.get(level).add(0, root.val);                hm.put(root.right, level+1);                stack.add(root.right);                hm.put(root.left, level+1);                stack.add(root.left);            }        }        return res;    }
33 / 33 test cases passed. Runtime: 6 ms  Your runtime beats 2.19% of javasubmissions.

1 0
原创粉丝点击