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
- LeetCode: Binary Tree Zigzag Level Order Traversal
- [LeetCode]Binary Tree Zigzag Level Order Traversal
- LeetCode Binary Tree Zigzag Level Order Traversal
- [Leetcode] Binary Tree Zigzag Level Order Traversal
- Leetcode: Binary Tree Zigzag Level Order Traversal
- LeetCode Binary Tree Zigzag Level Order Traversal
- [LeetCode] Binary Tree Zigzag Level Order Traversal
- [Leetcode] Binary Tree Zigzag Level Order Traversal
- Binary Tree Zigzag Level Order Traversal
- 【leetcode】Binary Tree Zigzag Level Order Traversal
- [LeetCode]Binary Tree Zigzag Level Order Traversal
- Binary Tree Zigzag Level Order Traversal
- Binary Tree Zigzag Level Order Traversal
- [Leetcode]Binary Tree Zigzag Level Order Traversal
- [leetcode]Binary Tree Zigzag Level Order Traversal
- Leetcode: Binary Tree Zigzag Level Order Traversal
- Binary Tree Zigzag Level Order Traversal
- Binary Tree Zigzag Level Order Traversal
- 消息推送
- java枚举类型enum的使用
- HttpClient PostMethod/GetMethod 转码方案
- 非ARC(assign,retain,copy)与ARC(strong,weak)
- ios俩个APP之间跳转、传值
- Binary Tree Zigzag Level Order Traversal
- opencv: SimpleBlobDetector 使用
- 严重: Servlet.service() for servlet jsp threw exception The Struts dispatcher cannot be found.
- UVA Add All(优先队列)
- 在android中实现iphone时钟app的秒表功能
- android之判断用户手势
- ios检测新版本并更新
- 冒泡排序
- 黑马程序员第七季——多线程机制