二叉树的锯齿形层次遍历

646 阅读1分钟

二叉树的锯齿形层次遍历

public class Solution {
    public List<List<Integer>> data = new ArrayList<List<Integer>>();
    
    /**
     * @param root: A Tree
     * @return: A list of lists of integer include the zigzag level order traversal * of its nodes values.
     */
    public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
        // write your code here
        if(root == null){
            return data;
        }
        Queue<TreeNode> queue = new LinkedList<TreeNode>();
        queue.offer(root);
        int level = 1;
        while(!queue.isEmpty()){
            int size = queue.size();
            List<Integer> list = new ArrayList<Integer>();
            for(int  i = 0; i < size; i++){
                TreeNode node = queue.poll();
                list.add(node.val);
                if(node.left != null){
                    queue.offer(node.left);
                }
                if(node.right != null){
                    queue.offer(node.right);
                }
            }
            if(level % 2 != 0){
                data.add(list);
            }else{
                Collections.reverse(list);
                data.add(list);
            }
            level++;
        }
        return data;
    }
}

解题思路:

解题思路:队列(先进先出)

将每层的节点插入到队列中, 然后遍历队列,再将下一层级的节点插入到队列中, 直到最后

如图中二叉树

image

先将根节点放入队列中如下图

image

然后遍历队列,循环取出队头元素,再将队元元素的左右节点放入到队列中,如下图

image

如此循环直到二叉树最深层级

通过一个level字段进行判断list是否进行反转。奇数不反转,偶数反转。