Leetcode---二叉樹的鋸齒形層次遍歷--思路
阿新 • • 發佈:2018-12-05
二叉樹的鋸齒形層次遍歷
題目連結:二叉樹的鋸齒形層次遍歷
解題思路:
- 思路上和普通層次遍歷沒有什麼區別,就多了一個偶數層翻轉集合順序
- 深度遍歷使用輔助棧結構,層次遍歷使用輔助佇列結構,java當中List結構也可以作為佇列使用
- 通過兩個數分別記錄當前層和下一層的節點數
- 一個List結構記錄每一層的節點,需要翻轉時將其反轉
- 一個List結構用作輔助佇列,起初將root入隊
- 利用佇列判斷迴圈結束,當佇列為空時,結束遍歷。
- 內層迴圈的作用是記錄當前層節點
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
if(root==null) {
return new ArrayList<List<Integer>>();
}
//層次遍歷二叉樹
//翻轉標誌
boolean resverse = true;
//層次遍歷二叉樹需要一個佇列,
LinkedList<TreeNode> queue = new LinkedList<TreeNode>();
//當前層和下一層個數的計數,如果不是輸出二重集合結構則不需要
int cur_floor = 1,next_floor = 0;
//返回值集合
List<List<Integer>> result = new ArrayList<List<Integer>>();
//一個臨時的儲存每層的List集合
ArrayList<Integer> temp = null;
TreeNode node = null;
queue.offer(root);
//當佇列不為空的時候進入迴圈
while(!queue.isEmpty()) {
temp = new ArrayList<Integer>();
while(cur_floor!=0) {
node = queue.poll();
temp.add(node.val);
--cur_floor;
if(node.left!=null) {
queue.offer(node.left);
++next_floor;
}
if(node.right!=null) {
queue.offer(node.right);
++next_floor;
}
}
resverse = !resverse;
if(resverse) {
int len = temp.size();
for(int i = 0;i<len/2;i++) {
int t = temp.get(i);
temp.set(i, temp.get(len-i-1));
temp.set(len-i-1, t);
}
}
result.add(temp);
cur_floor = next_floor;
next_floor = 0;
}
return result;
}