1. 程式人生 > >Leetcode---二叉樹的鋸齒形層次遍歷--思路

Leetcode---二叉樹的鋸齒形層次遍歷--思路

二叉樹的鋸齒形層次遍歷

題目連結:二叉樹的鋸齒形層次遍歷

解題思路:
  • 思路上和普通層次遍歷沒有什麼區別,就多了一個偶數層翻轉集合順序
  • 深度遍歷使用輔助棧結構,層次遍歷使用輔助佇列結構,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; }