Binary Tree Level Order Traversal (leetcode 102/103/107)

Binary Tree Level Order Traversal

Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, level by level).node

BFScode

思路: 典型的BFS, 使用queue. 兩層循環,外層判斷queue 是否爲空,內層for循環queue的size,而後逐個彈出node, 把左右兒子再壓入。 注意開始的root == null 的判斷。it

時間複雜度: O(N)
空間複雜度: O(w) where w is maximum width of Binary Tree.io

public class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> result = new ArrayList<List<Integer>>();
        Queue<TreeNode> queue = new LinkedList<TreeNode>();
        if (root == null) {
            return result;
        }
        queue.add(root);
        while (queue.peek() != null) {
            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.add(node.left);
                }
                if (node.right != null) {
                    queue.add(node.right);
                }
            }
            result.add(list);
        }
        return result;
    }
}

Binary Tree Level Order Traversal 2

Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left to right, level by level from leaf to root).for循環

思路: BFS, 由於是bottom-up, 因此每次加入list都加到開頭:bfs.add(0, level);class

public class Solution {
    public List<List<Integer>> levelOrderBottom(TreeNode root) {
        List<List<Integer>> bfs = new ArrayList<List<Integer>>();
        Queue<TreeNode> queue = new LinkedList<TreeNode>();
        if (root == null) {
            return bfs;
        }
        queue.add(root);
        while(!queue.isEmpty()){
            ArrayList<Integer> level = new ArrayList<Integer>();
            int size = queue.size();
            
            for(int i = 0; i < size; i++){
                TreeNode head = queue.poll();
                level.add(head.val);
                if(head.left != null){
                    queue.add(head.left);
                }
                if(head.right != null){
                    queue.add(head.right);
                }
            }
            bfs.add(0, level);
        }
        return bfs;
        
    }
}

Binary Tree Zigzag Level Order Traversal

思路: 設置一個flag,來肯定該層是從左往右,仍是從右往左。Collections.reverse(level) 變換方向。List

public class Solution {
    public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
        List<List<Integer>> result = new ArrayList<List<Integer>>();
        if(root == null){
            return result;
        }
        Queue<TreeNode> queue = new LinkedList<TreeNode>();
        queue.offer(root);
        int flag = -1;
        while(queue.peek() != null){
            flag = 0 - flag;
            int size = queue.size();
            List<Integer> level = new ArrayList<Integer>();
            for(int i = 0; i < size; i++){
                TreeNode head = queue.poll();
                level.add(head.val);
                if(head.left != null){
                    queue.offer(head.left);
                }
                if(head.right != null){
                    queue.offer(head.right);
                }
                
            }
            if(flag == -1){
                Collections.reverse(level);
            }
            result.add(level);
        }
        return result;
    }
    
}
相關文章
相關標籤/搜索