二叉樹的鋸齒形層序遍歷
給定一個(gè)二叉樹,返回其節(jié)點(diǎn)值的鋸齒形層序遍歷。(即先從左往右,再?gòu)挠彝筮M(jìn)行下一層遍歷,以此類推,層與層之間交替進(jìn)行)。
例如:
給定二叉樹 [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回鋸齒形層序遍歷如下:
[
[3],
[20,9],
[15,7]
]
思路:
依然使用隊(duì)列,不過要用雙端隊(duì)列了,每一層出隊(duì)列和添加新元素進(jìn)入隊(duì)列的順序都和上一層相反,用一個(gè)標(biāo)志表示即可。
代碼:
class Solution {
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
List<List<Integer>> res=new ArrayList<>();
Deque<TreeNode> deque =new ArrayDeque<>();
//這個(gè)表示隊(duì)列中當(dāng)前層的節(jié)點(diǎn)是否從下面出雙端隊(duì)列
boolean isDown =true;
if(root==null){return res;}
deque.add(root);
while(deque.size()!=0){
List<Integer> list=new ArrayList<>();
int num=deque.size();
if(isDown){
for(int i=0;i<num;i++){
TreeNode node=deque.pollLast();
list.add(node.val);
if(node.left!=null){deque.addFirst(node.left);}
if(node.right!=null) {deque.addFirst(node.right); }
}
}
else{
for(int i=0;i<num;i++){
TreeNode node=deque.pollFirst();
list.add(node.val);
if(node.right!=null) {deque.addLast(node.right); }
if(node.left!=null){deque.addLast(node.left);}
}
}
res.add(list);
isDown=!isDown;
}
return res;
}
}