题目描述
给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
示例:
例如: 给定二叉树: [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 返回其层次遍历结果: [ [3], [9,20], [15,7] ]
思路
1.思路与102.树的层次遍历相似,只不过需要隔层翻转。
2.可以设置一个翻转标识位flag,当falg == true时,进行头插法,这样便实现了翻转。
Java代码实现
public List<List<Integer>> zigzagLevelOrder(TreeNode root) { List<List<Integer>> res = new ArrayList<>(); LinkedList<TreeNode> nodes = new LinkedList<>(); List<Integer> curVals = new ArrayList<>(); int curMax = 1; int count = 0; if(root != null) nodes.add(root); //true : 反向压入值 false :正向压入值 boolean flag = false; while(!nodes.isEmpty()){ TreeNode cur = nodes.pollFirst(); if(flag) curVals.add(0,cur.val); else curVals.add(cur.val); count++; if(cur.left != null) nodes.add(cur.left); if(cur.right != null) nodes.add(cur.right); if(count == curMax){ curMax = nodes.size(); count = 0; res.add(new ArrayList<>(curVals)); curVals = new ArrayList<>(); flag = !flag; } } return res; }