力扣刷题之深度优先遍历
迪恩_Emma
喜欢看书的Java开发
展开
-
617. 合并二叉树(简单)
思路:深度优先遍历分别遍历两个二叉树的左节点,右节点,分别相加代码:class Solution { public TreeNode mergeTrees(TreeNode root1, TreeNode root2) { if(root1==null){ return root2; } if(root2==null){ return root1; } TreeNode merge=new TreeNode(root1.val+root2.原创 2021-06-16 09:23:02 · 109 阅读 · 0 评论 -
543. 二叉树的直径(简单)
思路:后序遍历,只是直径指的是边,而不是节点的个数代码:class Solution { int max=0; public int diameterOfBinaryTree(TreeNode root) { depth(root); return max; } private int depth(TreeNode root){ if(root==null){ return 0; } int left=depth(root.left.原创 2021-06-15 09:51:19 · 121 阅读 · 0 评论 -
494. 目标和(中等)
思路:0-1背包问题,回溯(深度优先遍历)代码:class Solution { int count=0; public int findTargetSumWays(int[] nums, int target) { dfs(nums,target,0,0); return count; } private void dfs(int[] nums,int target,int index,int sum){ //index==nums.length表示.原创 2021-06-14 10:06:01 · 98 阅读 · 0 评论 -
437. 路径总和 III(中等)
思路:双递归代码:class Solution { public int pathSum(TreeNode root, int sum) { //双递归,保证每个节点都作为一次根节点 if(root==null){ return 0; } return res(root,sum)+pathSum(root.left,sum)+pathSum(root.right,sum); } private int res(TreeNode root,int.原创 2021-06-13 09:49:18 · 72 阅读 · 0 评论 -
124. 二叉树中的最大路径和(困难)
思路:动态规划,深度优先遍历代码:public class Solution { private int res; public int maxPathSum(TreeNode root) { res=Integer.MIN_VALUE; dfs(root); return res; } private int dfs(TreeNode root){ if(root==null){ return 0; } int left=Ma.原创 2021-06-04 10:14:42 · 70 阅读 · 0 评论 -
105. 从前序与中序遍历序列构造二叉树(中等)
思路:哈希+深度优先遍历代码:class Solution { int[] preorder; Map<Integer,Integer> map=new HashMap<>(); public TreeNode buildTree(int[] preorder, int[] inorder) { this.preorder=preorder; for(int i=0;i<inorder.length;i++){ map.put(in.原创 2021-06-03 09:31:36 · 90 阅读 · 0 评论 -
104. 二叉树的最大深度(简单)
思路:深度优先遍历代码:class Solution { public int maxDepth(TreeNode root) { if(root==null){ return 0; } return Math.max(maxDepth(root.left),maxDepth(root.right))+1; }}分解:1)核心代码:比较左右子树中较大的一个,再+1return Math.max(maxDepth(root.lef..原创 2021-06-03 09:15:30 · 188 阅读 · 0 评论 -
101. 对称二叉树(简单)
思路:递归代码:class Solution { public boolean isSymmetric(TreeNode root) { //二叉树的问题要么用递归,要么用中序遍历 return dfs(root,root); } private boolean dfs(TreeNode t1,TreeNode t2){ if(t1==null&&t2==null){ return true; } if(t1==null||.原创 2021-06-02 10:01:30 · 96 阅读 · 0 评论 -
98. 验证二叉搜索树(中等)
思路:利用递归,剪枝条件是当前root的val不小于左边且不大于右边代码:class Solution { public boolean isValidBST(TreeNode root) { return isValidBST(root,Long.MIN_VALUE,Long.MAX_VALUE); } private boolean isValidBST(TreeNode node,long low,long high){ if(node==null){.原创 2021-06-02 09:52:16 · 78 阅读 · 0 评论 -
39. 组合总和(中等)
思路:一个典型的深度优先遍历(回溯)注意遍历的起始是start,而不是0代码:class Solution { public List<List<Integer>> combinationSum(int[] candidates, int target) { int n=candidates.length; //设置一个栈 Deque<Integer> path=new ArrayDeque<>(); List&.原创 2021-05-29 10:16:30 · 50 阅读 · 0 评论 -
剑指 Offer 55 - II. 平衡二叉树(简单)
思路:利用递归,先序遍历/后序遍历代码:先序遍历:class Solution { public boolean isBalanced(TreeNode root) { //先序遍历,自顶向下 if(root==null) return true; return Math.abs(Depth(root.left)-Depth(root.right))<2&& isBalanced(root.left)&&isBalanc.原创 2021-05-11 09:51:46 · 121 阅读 · 0 评论 -
剑指 Offer 38. 字符串的排列(中等)
思路:与46全排列的题目一样,都是深度优先搜索(回溯算法)这里的不同点是进行2个方面的剪枝:i)当前遍历的字母,不能出现重复,也就是visited[i]!=true才行ii)当要求的几个字符串中有重复的字母出现时方法一:自定义一个方法排除重复字符串方法二:Set排序重复字符串代码:方法一:class Solution { public String[] permutation(String s) { List<String> pre=..原创 2021-05-03 11:40:10 · 114 阅读 · 1 评论 -
剑指 Offer 34. 二叉树中和为某一值的路径(中等)
思路:典型的深度优先遍历(回溯算法)代码:class Solution { public List<List<Integer>> pathSum(TreeNode root, int target) { List<List<Integer>> res=new ArrayList<>(); List<Integer> path=new ArrayList<Integer>();.原创 2021-04-30 11:38:39 · 68 阅读 · 0 评论 -
剑指 Offer 17. 打印从1到最大的n位数(简单)
思路:如果不考虑大数,就只是一道简单题,若考虑,难度骤增方法一:不考虑时方法二:dfs(String)方法三:dfs(int[])代码:方法一:class Solution { public int[] printNumbers(int n) { if(n==0) return null; int N=(int)Math.pow(10,n)-1; int[] res=new int[N]; for(int i=0;i<N;i++){ .原创 2021-04-22 15:14:11 · 69 阅读 · 0 评论 -
剑指 Offer 13. 机器人的运动范围(中等)
思路:典型的dfs(深度优先)、bfs(广度优先)题目代码:class Solution { int m,n,res=0; int[][] dirs={{0,1},{1,0}}; //这里不能像之前一样,设字符串为'/0'来作为已访问 boolean[][] visited; public int movingCount(int m, int n, int k) { //在这里才实例化,前面的m和n是形参 this.visited=new boolean[m].原创 2021-04-20 10:53:05 · 68 阅读 · 0 评论 -
剑指 Offer 12. 矩阵中的路径(中等)
思路:这题与岛屿数量问题类似,用深度优先(回溯算法)题目有2个限制条件:i)通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格ii)同一个单元格内的字母不允许被重复使用代码:class Solution { public boolean exist(char[][] board, String word) { ArrayDeque<Character> path=new ArrayDeque<>();..原创 2021-04-19 10:52:59 · 86 阅读 · 0 评论 -
剑指 Offer 07. 重建二叉树(中等)
思路:树,就想到深度优先(回溯算法)一整个过程是这样的:遍历先序数组,为每个根节点的值创建节点,并递归将node.left、node.right接上代码:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x..原创 2021-04-17 10:14:19 · 181 阅读 · 0 评论 -
51.N皇后(困难)
思路:利用深度优先(回溯算法),遍历所有格子,不符合条件的就回溯代码:class Solution { public List<List<String>> solveNQueens(int n) { int[] queens=new int[n]; Arrays.fill(queens,-1); List<List<String>> res=new ArrayList<>(); //相当于vi.原创 2021-04-12 11:12:05 · 161 阅读 · 0 评论 -
22. 括号生成(中等)
思路:"子集",联想到深度优先(回溯)代码:class Solution { public List<String> generateParenthesis(int n) { List<String> res=new ArrayList<>(); StringBuilder path=new StringBuilder(); bfs(path,res,0,0,n); return res; } private vo.原创 2021-04-11 11:30:53 · 85 阅读 · 0 评论 -
17. 电话号码的字母组合(中等)
思路:"给出子集"这四个字就让人联想到深度优先(回溯算法)这题与前面几题不同的是,要搜索2个地方的字符串代码:class Solution { public List<String> letterCombinations(String digits) { List<String> res=new ArrayList<>(); if(digits.length()==0) return res; StringBuilder pat.原创 2021-04-11 11:01:04 · 90 阅读 · 0 评论 -
90. 子集 II(中等)
思路:与78题类似,都是使用深度优先(回溯算法),每一层的数字都进行一次分支但这里给的数组中有重复元素,搜索时,会产生重复子集,所以要进行剪枝代码:class Solution { public List<List<Integer>> subsetsWithDup(int[] nums) { int n=nums.length; Arrays.sort(nums); Deque<Integer> path=new ArrayDe.原创 2021-04-11 10:11:44 · 82 阅读 · 0 评论 -
78.子集(中等)
思路:每一层选出一个数产生分支,利用深度优先(回溯算法),也就是一个栈代码:class Solution { public List<List<Integer>> subsets(int[] nums) { int n=nums.length; Deque<Integer> path=new ArrayDeque<>(); List<List<Integer>> res=new ArrayLi原创 2021-04-11 09:55:18 · 73 阅读 · 0 评论 -
39. 组合总和(中等)
思路:和46、47题全排列相似,都是利用深度优先(回溯算法)但是这里可以重复使用元素,则不需要设置一个visited的数组了这里的剪枝出现在相加>target的时候代码:class Solution { public List<List<Integer>> combinationSum(int[] candidates, int target) { int n=candidates.length; //设置一个栈 Deque<.原创 2021-04-09 14:35:32 · 60 阅读 · 0 评论 -
47. 全排列 II(中等)
思路:与46题类似,都是使用深度优先(回溯算法)不过这里的数会有重复,要进行剪枝代码:class Solution { public List<List<Integer>> permuteUnique(int[] nums) { int n=nums.length; Deque<Integer> path=new ArrayDeque<>(); List<List<Integer>>.原创 2021-04-09 11:05:05 · 102 阅读 · 0 评论 -
126. 单词接龙 II(困难)
思路:求最短路径问题,很自然地想到要用广度优先遍历代码:class Solution { public List<List<String>> findLadders(String beginWord, String endWord, List<String> wordList) { //先将wordList放到哈希表中 Set<String> wordSet=new HashSet<>(wordList); .原创 2021-04-05 14:59:18 · 196 阅读 · 1 评论 -
46. 全排列(中等)
思路:利用深度优先,就是回溯算法,把每个值都遍历一次代码:class Solution { public List<List<Integer>> permute(int[] nums) { int n=nums.length; Deque<Integer> path=new ArrayDeque<>(); boolean[] visited=new boolean[n]; List<List<.原创 2021-04-09 10:22:01 · 76 阅读 · 0 评论