問題
給定一個二叉樹,返回其節點值的鋸齒形層次遍歷。(即先從左往右,再從右往左進行下一層遍歷,以此類推,層與層之間交替進行)。
例子
思路
-
方法1
使用隊列,先按從上到下的順序逐行打印,然後把下標爲奇數的行都翻轉
-
方法2
使用dfs【正常的層次遍歷不能用】,保存一個參數level,如果level爲奇數,說明需要翻轉則頭插【每次插在下標0】,否則尾插
代碼
//方法1
class Solution {
public void reverse(List<Integer> t){
int i=0,j=t.size()-1;
while(i<j) {
int a = t.get(i);
t.set(i,t.get(j));
t.set(j,a);
i++;
j--;
}
}
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
List<List<Integer>> list = new ArrayList<>();
if(root==null) return list;
Queue<TreeNode> q = new LinkedList<>();
q.offer(root);
while(q.size()>0) {
int len = q.size();
List<Integer> temp = new ArrayList<>();
for(int i=0; i<len; i++) {
TreeNode node = q.poll();
temp.add(node.val);
if(node.left!=null) q.offer(node.left);
if(node.right!=null) q.offer(node.right);
}
list.add(temp);
}
for(int i=0; i<list.size(); i++) {
if(i%2==1) {
List<Integer> t = list.get(i);
reverse(t);
}
}
return list;
}
}
//方法2
class Solution {
public void reverse(List<Integer> t){
int i=0,j=t.size()-1;
while(i<j) {
int a = t.get(i);
t.set(i,t.get(j));
t.set(j,a);
i++;
j--;
}
}
public void dfs(List<List<Integer>> list, TreeNode root, int level) {
if(root==null) return;
if(list.size()==level) list.add(new ArrayList<Integer>());
if(level%2==1) list.get(level).add(0,root.val);
else list.get(level).add(root.val);
dfs(list,root.left,level+1);
dfs(list,root.right,level+1);
}
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
List<List<Integer>> list = new ArrayList<>();
if(root==null) return list;
dfs(list,root,0);
return list;
}
}