题目描述
给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
例如:
给定二叉树 [3,9,20,null,null,15,7],
3
/
9 20
/
15 7
返回锯齿形层次遍历如下:
[
[3],
[20,9],
[15,7]
]
思路分析:
这个题目首先,就是做到如何去遍历,我用到的是dfs去遍历这棵树,然后巧妙地运用id这个标记序号,它代表了这个结点应该属于那一层,然后用它每次去和list.size去比较,小于它时就证明他以及存在兄弟结点了,只用在那一层将它的值加入即可,反之,如果id大于等于list.size,说明它是第一个到达该层的结点,我们给list添加新列表,然后保存node的值,显然,这样做完之后,得到的结果全部都是先遍历左再遍历右的结果,题目要求的是我们要每一层的遍历顺序不一样,左右轮换着来,那我们完全可以在拿到结果之后,对列表的所有偶数层进行反转保存,就能得到题目要求的结果,最终得出的代码执行效率还要略高于官方所提供的。
/**
* 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>> list = new LinkedList<List<Integer>>();
List<Integer> temp = new LinkedList<Integer>();
list.add(temp);
list = work(root,list,0);
int k = 0;
for(List<Integer> res:list) {
k++;
if(k % 2 == 0)
Collections.reverse(res);
}
return list;
}
public List<List<Integer>> work(TreeNode node,List<List<Integer>> list,int id) {
if(id >= list.size()) {
List<Integer> temp = new LinkedList<Integer>();
temp.add(node.val);
list.add(temp);
}else {
list.get(id).add(node.val);
}
if(node.left != null) {
work(node.left,list,id+1);
}
if(node.right != null) {
work(node.right,list,id+1);
}
return list;
}
}/**
* 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>> list = new LinkedList<List<Integer>>();
if(root == null)
return list;
List<Integer> temp = new LinkedList<Integer>();
list.add(temp);
list = work(root,list,0);
int k = 0;
for(List<Integer> res:list) {
k++;
if(k % 2 == 0)
Collections.reverse(res);
}
return list;
}
public List<List<Integer>> work(TreeNode node,List<List<Integer>> list,int id) {
if(id >= list.size()) {
List<Integer> temp = new LinkedList<Integer>();
temp.add(node.val);
list.add(temp);
}else {
list.get(id).add(node.val);
}
if(node.left != null) {
work(node.left,list,id+1);
}
if(node.right != null) {
work(node.right,list,id+1);
}
return list;
}
}