Binary Tree Zigzag Level Order Traversal

来源:互联网 发布:docker容器连接数据库 编辑:程序博客网 时间:2024/06/14 18:23

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


Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to right, then right to left for the next level and alternate between).

For example:
Given binary tree {3,9,20,#,#,15,7},

    3   / \  9  20    /  \   15   7

return its zigzag level order traversal as:

[  [3],  [20,9],  [15,7]]

public List<List<Integer>> zigzagLevelOrder(TreeNode root)

这一题,其实就是level order traversal的稍微的一个延伸。差别不大。做的时候只需要判断当前level是否能被2整除即可。在这里,我们用LinkedList这个数据结构代替了Queue...当然,Queue的最基本的实现类其实也是LinkedList。但这里LinkedList实现的是一个双向队列的作用。这样可以正反方向的进行加数据或者提取数据。

BFS的做法需要很小心,因为在双向操作,所以在加数据的时候不能影响到提取数据的顺序。这里我的做法是这样的:

在能被2整除的时候就是去尾加头,反则就是去头加尾。顺序不能反,否则就不行了。

下面给出代码:

    public List<List<Integer>> zigzagLevelOrder(TreeNode root) {        List<List<Integer>> res = new LinkedList<List<Integer>>();        LinkedList<TreeNode> cached = new LinkedList<TreeNode>();        int curlevel = 1;        int cursize = 1;        cached.add(root);        List<Integer> cur_level = new LinkedList<Integer>();        while(!cached.isEmpty()){            root = curlevel % 2 == 1 ? cached.removeFirst() : cached.removeLast();            if(root == null)                continue;            if(curlevel % 2 == 1){                if(root.left != null)                    cached.addLast(root.left);                if(root.right != null)                    cached.addLast(root.right);            }else{                if(root.right != null)                    cached.addFirst(root.right);                if(root.left != null)                    cached.addFirst(root.left);            }            cursize--;            cur_level.add(root.val);            if(cursize == 0){                curlevel++;                cursize = cached.size();                res.add(cur_level);                cur_level = new LinkedList<Integer>();            }        }        return res;    }

事实上,在这个题目上DFS显得更加便利。因为不需要维护一个双向队列的加删数据的方向。只需要判断当前层的LinkedList是正向放数据还是反向放数据就可以了。下面直接给出代码。

    public List<List<Integer>> zigzagLevelOrder(TreeNode root) {        List<List<Integer>> res = new LinkedList<List<Integer>>();        helper(res, 0, root);        return res;    }        public void helper(List<List<Integer>> res, int level, TreeNode root){        if(root == null)            return;        LinkedList<Integer> cur_res;        if(level >= res.size()){            cur_res = new LinkedList<Integer>();            res.add(cur_res);        }else{            cur_res = (LinkedList<Integer>)res.get(level);        }        if(level % 2 == 1)            cur_res.addFirst(root.val);        else            cur_res.add(root.val);        helper(res, level + 1, root.left);        helper(res, level + 1, root.right);    }

但是话说回来,包括Level Order Traversal,DFS有它在LEETCODE里的特殊性,因为Leetcode 是要求返回一个二维List,而不是直接print。但是如果题目的要求是直接print。那么DFS就完全没有生存的空间了。否则就需要比BFS多占用这个二维List的空间,空间的消耗上就大了许多。

0 0
原创粉丝点击