Loading

LeetCode-BFS&DFS

102. Binary Tree Level Order Traversal 二叉树级序遍历

https://leetcode.com/problems/binary-tree-level-order-traversal/

题目:给定二叉树,返回节点值的水平顺序遍历。(从左到右,逐级)。

思路:

BFS:

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

DFS:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> res = new ArrayList<>();
        if(root == null) return res;
        dfs(res, root, 0);
        return res;
    }
    
    public void dfs(List<List<Integer>> res, TreeNode node, int level) {
        if(node == null) return;
        List<Integer> cur;
        if(level >= res.size()) {
            cur = new ArrayList<>();
            cur.add(node.val);
            res.add(cur);
        } else {
            cur = res.get(level);
            cur.add(node.val);
        }
        dfs(res, node.left, level+1);
        dfs(res, node.right, level+1);
    }
}
View Code

127. Word Ladder 单词梯子

https://leetcode.com/problems/word-ladder/

题目:给定两个单词(首词和尾词)和字典的单词列表,找出从开头到结尾的最短转换序列的长度,每次转换只能更改一个字母。每个转换后的单词必须存在于单词列表中。请注意,首词不是一个转换的词。

思路:BFS,

class Solution {
    public int ladderLength(String beginWord, String endWord, List<String> wordAsList) {
        if(beginWord.equals(endWord)) return 1;
        if (!wordAsList.contains(endWord)) {
            return 0;
        }
        
        Queue<String> queue = new LinkedList<>();
        queue.add(beginWord);
        wordAsList.remove(beginWord);
        
        int level = 2;
        
        while(!queue.isEmpty()) {
            int size = queue.size();
            for(int i = 0; i < size; i++) {
                String temp = queue.poll();
                for(int j = 0; j < temp.length(); j++) {
                    char[] chars = temp.toCharArray();
                    for(char c = 'a'; c <= 'z'; c++) {
                        chars[j] = c;
                        String strtemp = String.valueOf(chars);
                        if(strtemp.equals(endWord)) return level;
                        if(wordAsList.remove(strtemp)) {
                            queue.add(strtemp);
                        }
                    }
                }
            }
            level++;
        }
        
        return 0;
    }
}
View Code

 207. Course Schedule 课程安排表

https://leetcode.com/problems/course-schedule/

题目:总共有n门课程,从0到n-1。有些课程可能有先决条件,例如,你必须先上1门课程,它表示为一对:[0,1]考虑到课程的总数和先决条件对的列表,你能完成所有课程吗?

思路:BFS,

class Solution {
    public boolean canFinish(int numCourses, int[][] prerequisites) {
        // 存放每个节点后面的节点
        List<Integer>[] nextCourses = new List[numCourses];
        // 每个节点的入度
        int[] preNum = new int[numCourses];
        for(int i = 0; i < numCourses; i++) {
            nextCourses[i] = new ArrayList<>();
        }
        
        for(int[] prerequisite : prerequisites) {
            int pre = prerequisite[1];
            int after = prerequisite[0];
            nextCourses[pre].add(after);
            // 后面的节点入度++
            preNum[after]++;
        }
        
        Queue<Integer> q = new LinkedList<>();
        List<Integer> res = new ArrayList<>();
        // 往队列中加入入度为0的节点
        for(int i = 0; i < numCourses; i++) {
            if(preNum[i] == 0) {
                q.offer(i);
            }
        }
        while(!q.isEmpty()) {
            int cur = q.poll();
            res.add(cur);
            for(int next : nextCourses[cur]) {
                preNum[next]--;
                if(preNum[next] == 0) {
                    q.offer(next);
                }
            }
        }
        return res.size() == numCourses;
    }
}
View Code

 

图:
深搜/广搜:http://oj.leetcode.com/problems/clone-graph/


搜索 & 遍历:
// http://oj.leetcode.com/problems/word-ladder/
http://oj.leetcode.com/problems/word-ladder-ii/
广搜:http://oj.leetcode.com/problems/surrounded-regions/

posted @ 2019-10-12 11:34  brynchen  阅读(203)  评论(0)    收藏  举报