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; } }
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); } }
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; } }
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; } }
图:
深搜/广搜: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/

浙公网安备 33010602011771号