码迷,mamicode.com
首页 > 其他好文 > 详细

103. Binary Tree Zigzag Level Order Traversal

时间:2017-08-07 01:27:24      阅读:141      评论:0      收藏:0      [点我收藏+]

标签:层次遍历   new   int   init   empty   return   --   研究   遍历   

Given a binary tree, return the zigzag level order traversal of its nodes values.
(ie, from left to right, then right to left for the next level and alternate between).
For example: Given binary tree [3,9,20,null,null,15,7], 3 / 9 20 / 15 7 return its zigzag level order traversal as: [ [3], [20,9], [15,7] ]

层次遍历+ 逆序偶数行

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
        List<List<Integer>> ans = new ArrayList<>();
        
        if (root == null) {
            //ans.add(list);
            return ans;
        }
        Queue<TreeNode> q = new LinkedList<>();
        int deep = 0;
        q.offer(root);
        while (!q.isEmpty()) {
            int size = q.size();
            deep++;
            List<Integer> list = new ArrayList<>();
            
             for (int i = 0; i < size; i++) {
                TreeNode cur = q.poll();
                list.add(cur.val);

               
                if (cur.left != null) {
                    q.offer(cur.left);
                }
                  if (cur.right != null) {
                    q.offer(cur.right);
                }
            }
            if (deep  % 2 == 1) {
                ans.add(list);
            } else {
                reverse(list);
                ans.add(list);
            }
                        
        }
        return ans;
    }
    private void reverse(List<Integer> list) {
        int i = 0, j = list.size() - 1;
        while (i < j) {
            int temp = (int)list.get(i);
            list.set(i, list.get(j));
            list.set(j, temp);
            i++; 
            j--;
        }
    }
}

 

贴一个DFS做法:很好, 但是还是bfs 好想, 以后再研究

  1. O(n) solution by using LinkedList along with ArrayList. So insertion in the inner list and outer list are both O(1),
  2. Using DFS and creating new lists when needed.
public class Solution {
    public List<List<Integer>> zigzagLevelOrder(TreeNode root) 
    {
        List<List<Integer>> sol = new ArrayList<>();
        travel(root, sol, 0);
        return sol;
    }
    
    private void travel(TreeNode curr, List<List<Integer>> sol, int level)
    {
        if(curr == null) return;
        
        if(sol.size() <= level)
        {
            List<Integer> newLevel = new LinkedList<>();
            sol.add(newLevel);
        }
        
        List<Integer> collection  = sol.get(level);
        if(level % 2 == 0) collection.add(curr.val);
        else collection.add(0, curr.val);
        
        travel(curr.left, sol, level + 1);
        travel(curr.right, sol, level + 1);
    }
}

  

 

103. Binary Tree Zigzag Level Order Traversal

标签:层次遍历   new   int   init   empty   return   --   研究   遍历   

原文地址:http://www.cnblogs.com/apanda009/p/7296558.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!