lintcode71-二叉樹的鋸齒遍歷

Question:

  二叉樹的鋸齒遍歷
  給出一棵二叉樹,返回其節點值的鋸齒形層次遍歷(先從左往右,下一層再從右往左,層與層之間交替進行)
  給出一棵二叉樹 {3,9,20,#,#,15,7},
      3
     / \
    9  20
      /  \
     15   7
  返回其鋸齒形的層次遍歷爲:
  [
     [3],
     [20,9],
     [15,7]
   ]

  Solution:
  鋸齒遍歷本質上還是廣度優先搜索,每一層按照從左到右的順序進行遍歷需要用到隊列
  還是藉助隊列按照每一層從左到右的順序進行遍歷,只不過需要維護一個每一層是正序還是倒序的標誌
  至於向list中倒序添加只需執行list.add(0,element)即可
  這裏參考:http://www.cnblogs.com/jasminemzy/p/7712971.html 摩拜一下大神
 
  步驟:
  1、初始化隊列及方向標誌,並將root入隊
  2、隊列不爲空,執行如下操作
  3、記錄隊列中當前元素的個數size,避免彈多了,入隊的格式就是這一層所有節點的個數
  4、出隊size個元素,左右兒子入隊,按方向性及出隊順序添加到結果集中
  5、方向置反

public class Q71_binaryTreeZigzagLevelOrderTraversal {
    
    public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
        // write your code here
        List<List<Integer>> result = new ArrayList<List<Integer>>();
        if(root == null)
            return result;
        Queue<TreeNode> queue = new LinkedList<TreeNode>();
        //正反向標誌
        boolean isForward = true;
        queue.offer(root);
        while(!queue.isEmpty()) {
            //由於下面還要向queue裏面添加節點,這個size就是上一層的節點總數
            int size = queue.size();
            List<Integer> subList = new ArrayList<Integer>();
            for(int i = 0 ; i < size ; i++) {
                TreeNode current = queue.poll();
                if(isForward)
                    subList.add(current.val);
                else
                    subList.add(0,current.val);
                if(current.left != null)
                    queue.offer(current.left);
                if(current.right != null)
                    queue.offer(current.right);
            }
            result.add(subList);
            //方向反轉
            isForward = !isForward;
        }
        return result;
    }

    @Test
    public void test() {
        TreeNode root = new TreeNode(1);
        root.left = new TreeNode(2);
        root.left.right = new TreeNode(5);
        root.left.left = new TreeNode(4);
        root.right = new TreeNode(3);
        List<List<Integer>> result = zigzagLevelOrder(root);
        System.out.println(result.toString());
    }
}


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章