5.1.6 Binary Tree Zigzag Level Order Traversal

来源:互联网 发布:mongodb与mysql区别 编辑:程序博客网 时间:2024/06/18 08:20

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

我的思路:使用和Binary Tree Level Order Traversal一样的方法,只是在输出的时候,设置一个boolean,对每一层进行反转。

我的代码:

public class Solution {    public ArrayList<ArrayList<Integer>> zigzagLevelOrder(TreeNode root) {        ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();        if(root == null) return result;        ArrayList<TreeNode> nodeList = new ArrayList<TreeNode>();        nodeList.add(root);        int nodeInCurLevel = 1;        int nodeInNextLevel = 0;        ArrayList<Integer> temp = new ArrayList<Integer>();        while(!nodeList.isEmpty()){            TreeNode node = nodeList.remove(0);            temp.add(node.val);            nodeInCurLevel --;            if(node.left != null){                nodeList.add(node.left);                nodeInNextLevel++;            }            if(node.right != null){                nodeList.add(node.right);                nodeInNextLevel++;            }            if(nodeInCurLevel == 0){                result.add(temp);                temp = new ArrayList<Integer>();                nodeInCurLevel = nodeInNextLevel;                nodeInNextLevel = 0;            }        }        boolean reverse = false;        ArrayList<ArrayList<Integer>> nResult = new ArrayList<ArrayList<Integer>>();        for(int i = 0; i < result.size(); i++){            ArrayList<Integer> list = result.get(i);            ArrayList<Integer> nList = new ArrayList<Integer>();            if(reverse == true){                for(int j = list.size()-1; j >=0; j--){                    nList.add(list.get(j));                }                nResult.add(nList);                reverse = false;            }            else{                nResult.add(list);                reverse = true;            }        }        return nResult;    }}

第二种方法:refer http://blog.csdn.net/muscler/article/details/23098359

它这种方法如果用在Level order traversal上面,连当前层和上一层的计数器都不需要了。(已经在leetcode上做了实验)。

/** * Definition for binary tree * public class TreeNode { *     int val; *     TreeNode left; *     TreeNode right; *     TreeNode(int x) { val = x; } * } */public class Solution {    //bfs 层序遍历,隔层reverse tmp    public ArrayList<ArrayList<Integer>> zigzagLevelOrder(TreeNode root) {        ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();        if (root == null) {            return res;        }        ArrayList<Integer> tmp = new ArrayList<Integer>();        Queue<TreeNode> queue = new LinkedList<TreeNode>();        queue.offer(root);        int num;        boolean reverse = false;        while (!queue.isEmpty()) {            num = queue.size();            tmp.clear();            for (int i = 0; i < num; i++) {                TreeNode node = queue.poll();                tmp.add(node.val);                if (node.left != null)                    queue.offer(node.left);                if (node.right != null)                    queue.offer(node.right);            }            if (reverse) {                Collections.reverse(tmp);                reverse = false;            }            else                reverse = true;            res.add(new ArrayList<Integer>(tmp));        }        return res;    }}

问题:倒数第二行代码:
res.add(new ArrayList<Integer>(tmp));
如果变成
res.add(tmp);

就会产生wrong answer. why?

Input:{1,2}

Output:[[2],[2]]

Expected:[[1],[2]]

0 0
原创粉丝点击