Showing posts with label Queue. Show all posts
Showing posts with label Queue. Show all posts

Thursday, July 24, 2014

Clone Graph

Clone an undirected graph. Each node in the graph contains a label and a list of its neighbors.

BFS: 用一个HashMap存储已经生成过的点,避免重复生成相同的点。
public class Solution {
    public UndirectedGraphNode cloneGraph(UndirectedGraphNode node) {
        if (node == null) {
            return null;
        }
        
        HashMap<UndirectedGraphNode, UndirectedGraphNode> map = 
        new HashMap<UndirectedGraphNode, UndirectedGraphNode>();
        Queue<UndirectedGraphNode> queue = new LinkedList<UndirectedGraphNode>();
        queue.offer(node);
        map.put(node, new UndirectedGraphNode(node.label));
        while (!queue.isEmpty()) {
            UndirectedGraphNode cur = queue.poll();
            UndirectedGraphNode newcur = map.get(cur);
            for (UndirectedGraphNode neig : cur.neighbors) {
                //if contains, this node has already been searched
                if (!map.containsKey(neig)) {
                    map.put(neig, new UndirectedGraphNode(neig.label));
                    queue.offer(neig);
                }
                newcur.neighbors.add(map.get(neig));
            }
        }
        return map.get(node);
    }
}

Wednesday, July 16, 2014

Binary Tree Level Order Traversal I && II

Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, level by level).
For example:
Given binary tree {3,9,20,#,#,15,7},
    3
   / \
  9  20
    /  \
   15   7
return its level order traversal as:
[
  [3],
  [9,20],
  [15,7]
]

用一个queue进行BFS。第二个只需把25行改成add(0, level)
public class Solution {
    //Time: O(n)  Space: O(n)
    public ArrayList<ArrayList<Integer>> levelOrder(TreeNode root) {
        ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
        if (root == null) {
            return res;
        }
        
        Queue<TreeNode> queue = new LinkedList<TreeNode>();
        queue.offer(root);
        while (!queue.isEmpty()) {
            int size = queue.size();
            ArrayList<Integer> level = new ArrayList<Integer>();
            for (int i = 0; i < size; i++) {
                TreeNode cur = queue.poll();
                level.add(cur.val);
                
                if (cur.left != null) {
                    queue.offer(cur.left);
                }
                if (cur.right != null) {
                    queue.offer(cur.right);
                }
            }
            res.add(level);
        }
        return res;
    }
}