leetcode
一些leetcode刷题经验,和学习与感悟。
为月提笔_
这个作者很懒,什么都没留下…
展开
-
a15 三数之和 垃圾解法
public List<List<Integer>> threeSum(int[] nums) { List<List<Integer>> res = new LinkedList<>(); if (nums.length <3)return res; Arrays.sort(nums); Integer preI=null ,preJ=null,preX=null;原创 2021-02-21 10:51:15 · 245 阅读 · 0 评论 -
1122. 数组的相对排序
public int[] relativeSortArray(int[] arr1, int[] arr2) { int[] bucket=new int[1001];//创建一个桶,足以容纳arr1中的最大的数 for (int i=0;i<arr1.length;i++){//记录arr1中的每个数的个数,并排序 bucket[arr1[i]]++; } int[] res = new int[arr1.len原创 2020-11-05 20:36:51 · 62 阅读 · 0 评论 -
leetcode 1609 奇偶树
public boolean isEvenOddTree(TreeNode root) { if (root == null ) return true; LinkedList<TreeNode> queue = new LinkedList<>(); queue.add(root); boolean res = true; boolean level = true; flag :...原创 2021-01-03 20:47:13 · 185 阅读 · 0 评论 -
leetcode 0403 特定深度节点链表
给定一棵二叉树,设计一个算法,创建含有某一深度上所有节点的链表(比如,若一棵树的深度为 D,则会创建出 D 个链表)。返回一个包含所有深度的链表的数组。 public ListNode[] listOfDepth(TreeNode tree) {//整体思路是层序遍历 int flag =0 ; ListNode[] res = new ListNode[dfs(tree)]; if (tree == null) return res;原创 2021-01-02 14:37:58 · 127 阅读 · 0 评论 -
leetcode 0405 检查二叉搜索树
Integer res = null; boolean flag =true; public boolean isValidBST(TreeNode root) { if (root == null) return true; isValidBST(root.left); if (res == null) res = root.val; else if (root.val <= res) flag = false;原创 2021-01-02 14:31:53 · 66 阅读 · 0 评论 -
leetcode 0408 首个共同祖先
TreeNode res = null;//超时 public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { if (root == null) return null; if (dfs(root,p) && dfs(root,q)){ if ( (dfs(root.left,p) || dfs(root.left,q)) &&a原创 2021-01-02 13:56:51 · 82 阅读 · 0 评论 -
leetcode 0410 检查子树
检查子树。你有两棵非常大的二叉树:T1,有几万个节点;T2,有几万个节点。设计一个算法,判断 T2 是否为 T1 的子树。如果 T1 有这么一个节点 n,其子树与 T2 一模一样,则 T2 为 T1 的子树,也就是说,从节点 n 处把树砍断,得到的树与 T2 完全相同。boolean flag = false; public boolean checkSubTree(TreeNode t1, TreeNode t2) { if (t1 ==null && t2 =原创 2021-01-02 10:36:54 · 86 阅读 · 0 评论 -
leetcode 0412 求和路径
路径只能是从根节点指向叶子节点的方向public int pathSum(TreeNode root, int sum) { if (root == null) return 0; return dfs(root,sum) + pathSum(root.left,sum) + pathSum(root.right,sum); } int dfs(TreeNode root,int sum){ if (root == null) retur原创 2021-01-02 09:44:54 · 91 阅读 · 0 评论 -
leetcode 671 二叉树中第二大的数
int res =-1; public int findSecondMinimumValue(TreeNode root) { if (root == null) { return res; } //如果存在子树并且值不相等,那么较大的值就有可能是第二小的 if (root.left != null && root.left.val != root.right.val) { //获取左右子树中将较原创 2021-01-01 18:38:53 · 162 阅读 · 0 评论 -
leetcode 100 相同的树
public boolean isSameTree(TreeNode p, TreeNode q) { if (p == null && q == null) return true; else if (p == null || q == null) return false; else if (p.val != q.val) return false; else return isSameTree(p.原创 2021-01-01 18:20:10 · 82 阅读 · 0 评论 -
leetcode 101 对称二叉树
public boolean isSymmetric(TreeNode root) { if (root == null) return true; return check(root.left,root.right); } boolean check(TreeNode left,TreeNode right){ if (left == null && right == null) return true; i原创 2021-01-01 18:19:41 · 101 阅读 · 0 评论 -
leetcode 104 二叉树的最大深度
public int maxDepth(TreeNode root) { if (root == null) return 0; if (root.left == null && root.right == null){ return 1; } return Math.max(maxDepth(root.left)+1,maxDepth(root.right)+1); }原创 2021-01-01 17:49:44 · 90 阅读 · 0 评论 -
leetcode 107 二叉树的层序遍历
public List<List<Integer>> levelOrderBottom(TreeNode root) { List<List<Integer>> res = new LinkedList<>(); if (root == null) return res; LinkedList<TreeNode> queue = new LinkedList<...原创 2021-01-01 16:57:52 · 64 阅读 · 0 评论 -
leetcode 108 将有序的数组转换成二叉搜索树
public TreeNode sortedArrayToBST(int[] nums) { if (Objects.isNull(nums) || nums.length ==0 )return null; int length = nums.length; TreeNode root = new TreeNode(nums[(length-1)/2]); System.out.println(root.val); roo.原创 2021-01-01 16:50:36 · 80 阅读 · 0 评论 -
leetcode 111 二叉树的最小深度
public int minDepth(TreeNode root) { return dfs(root); } int dfs(TreeNode root ){ if (root == null) return 0; if (root.left == null && root.right == null){ return 1; } if (root.left !=...原创 2021-01-01 15:52:49 · 73 阅读 · 0 评论 -
leetcode 112 路径总和
public boolean hasPathSum(TreeNode root, int sum) { if (root == null){ return false; } if (root.left == null && root.right == null){ return sum == root.val; } return hasPathSum(roo...原创 2021-01-01 15:26:04 · 69 阅读 · 0 评论 -
leetcode 226 翻转二叉树
public TreeNode invertTree(TreeNode root) { if (root == null) return null; LinkedList<TreeNode> queue = new LinkedList<>(); queue.addFirst(root); TreeNode t = null; while (!queue.isEmpty()){ T原创 2021-01-01 14:58:23 · 65 阅读 · 0 评论 -
leetcode 235二叉搜索树的最近公共祖先
TreeNode head ; public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { if (root == null) return null; if (q.val < root.val && p.val < root.val){ return lowestCommonAncestor(root.left,...原创 2020-12-31 16:32:59 · 66 阅读 · 0 评论 -
leetcode 257 二叉树的所有路径
List<String> res = new LinkedList<>(); public List<String> binaryTreePaths(TreeNode root) { dfs(root,""); return res; } void dfs(TreeNode root,String path){ if (root != null ) { StringBui..原创 2021-02-01 19:53:40 · 218 阅读 · 0 评论 -
leetcode 404 左叶子之和
计算给定二叉树的所有左叶子之和。public int sumOfLeftLeaves(TreeNode root) { int num=0; LinkedList<TreeNode> queue = new LinkedList<>(); queue.add(root); while (!queue.isEmpty()){ TreeNode node = queue.poll();原创 2020-12-30 16:45:49 · 62 阅读 · 0 评论 -
leetcode 501 二叉搜索树的众数
给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素)。 Map<Integer,Integer> map = new HashMap<>(); public int[] findMode(TreeNode root) { dfs(root); int num =0; List<Integer> res = new ArrayList<>(); f原创 2020-12-30 16:13:27 · 74 阅读 · 0 评论 -
leetcode 530 二叉搜索树的最小绝对差
给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值。int res = Integer.MAX_VALUE; TreeNode pre; public int getMinimumDifference(TreeNode root) { dfs(root); return res; } void dfs(TreeNode root){ if (root == null) return;原创 2020-12-30 16:12:29 · 72 阅读 · 0 评论 -
leetcode 543 二叉树的直径
给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。int res=0; public int diameterOfBinaryTree(TreeNode root) { depth(root); return res; } int depth(TreeNode root){ if (root == null)return 0; int L原创 2020-12-30 13:23:22 · 73 阅读 · 0 评论 -
leetcode 563二叉树的坡度
给定一个二叉树,计算 整个树 的坡度 。一个树的 节点的坡度 定义即为,该节点左子树的节点之和和右子树节点之和的 差的绝对值 。如果没有左子树的话,左子树的节点之和为 0 ;没有右子树的话也是一样。空结点的坡度是 0 。整个树 的坡度就是其所有节点的坡度之和 public int findTilt(TreeNode root) { if (root == null) return 0; LinkedList<TreeNode> queue = new原创 2020-12-30 11:39:25 · 146 阅读 · 0 评论 -
leetcode 572 另一个树的子树
给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值的子树。s 的一个子树包括 s 的一个节点和这个节点的所有子孙。s 也可以看做它自身的一棵子树 public boolean isSubtree(TreeNode s, TreeNode t) { LinkedList<TreeNode> queue = new LinkedList<>(); queue.add(s); while (!queue.原创 2020-12-30 11:31:01 · 87 阅读 · 0 评论 -
leetcode 606 根据二叉树创建字符串
你需要采用前序遍历的方式,将一个二叉树转换成一个由括号和整数组成的字符串。空节点则用一对空括号 “()” 表示。而且你需要省略所有不影响字符串与原始二叉树之间的一对一映射关系的空括号对。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/construct-string-from-binary-tree著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。public String tree2str(TreeNode t) {原创 2020-12-30 10:36:36 · 81 阅读 · 0 评论 -
leetcode 617 合并二叉树
给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点 public TreeNode mergeTrees(TreeNode t1, TreeNode t2) { if (t1 == null){ return t2; } if (t2 ==原创 2020-12-30 09:51:45 · 78 阅读 · 0 评论 -
leetcode 637 二叉树的层平均值
给定一个非空二叉树, 返回一个由每层节点平均值组成的数组。 public List<Double> averageOfLevels(TreeNode root) { List<TreeNode> queue = new LinkedList<>(); List<Double> res = new LinkedList<>(); queue.add(root); while (!原创 2020-12-30 09:39:21 · 69 阅读 · 0 评论 -
leetcode 653两数之和
public boolean findTarget(TreeNode root, int k) { List<Integer> arr = new ArrayList<>(); Map<Integer,Integer> map = new HashMap<>(); dfs(root,arr); int len = arr.size(); ...原创 2020-12-30 09:12:18 · 75 阅读 · 0 评论 -
leetcode 589 N叉树的前序遍历
public List<Integer> preorder(Node root) { LinkedList<Node> queue = new LinkedList<>(); LinkedList<Integer> res = new LinkedList<>(); if (root == null) return res; queue.add(root); w...原创 2020-12-28 12:51:37 · 56 阅读 · 0 评论 -
leetcode 590 N叉树的后序遍历
给定一个 N 叉树,返回其节点值的后序遍历List<Integer> res = new LinkedList<>(); public List<Integer> postorder(Node root) { dfs(root); return res; } void dfs(Node root){ if (root == null) return; for原创 2020-12-28 11:13:28 · 74 阅读 · 0 评论 -
leetcode 700 二叉搜索树中的搜索
给定二叉搜索树(BST)的根节点和一个值。 你需要在BST中找到节点值等于给定值的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 NULL。 public TreeNode searchBST(TreeNode root, int val) { if (root == null || root.val == val) return root; return val < root.val ? searchBST(root.left,val):searchBS原创 2020-12-23 17:29:34 · 81 阅读 · 0 评论 -
leetcode 783 二叉搜索树节点最小距离
给定一个二叉搜索树的根节点 root,返回树中任意两节点的差的最小值。示例:输入: root = [4,2,6,1,3,null,null]输出: 1解释:注意,root是树节点对象(TreeNode object),而不是数组。给定的树 [4,2,6,1,3,null,null] 可表示为下图: 4 / \ 2 6 / \ 1 3 最小的差值是 1, 它是节点1和节点2的差值, 也是节点3和节点2的差值。思路通过中序遍历,依次求相邻节原创 2020-12-23 16:59:57 · 69 阅读 · 0 评论 -
872 叶子相似的树
请考虑一棵二叉树上所有的叶子,这些叶子的值按从左到右的顺序排列形成一个 叶值序列 。举个例子,如上图所示,给定一棵叶值序列为 (6, 7, 4, 9, 8) 的树。如果有两棵二叉树的叶值序列是相同,那么我们就认为它们是 叶相似 的。如果给定的两个头结点分别为 root1 和 root2 的树是叶相似的,则返回 true;否则返回 false List<Integer> t1 = new LinkedList<>(); List<Integer> t原创 2020-12-23 16:20:32 · 75 阅读 · 0 评论 -
897 递增顺序查找树
给你一个树,请你 按中序遍历 重新排列树,使树中最左边的结点现在是树的根,并且每个结点没有左子结点,只有一个右子结点。TreeNode head,tmp; public TreeNode increasingBST(TreeNode root) { if (root == null) return null; BST(root); return head; } void BST(TreeNode root){ if (原创 2020-12-23 15:37:31 · 59 阅读 · 0 评论 -
938 二叉搜索树的范围和
给定二叉搜索树的根结点 root,返回值位于范围 [low, high] 之间的所有结点的值的和。 int res =0; public int rangeSumBST(TreeNode root, int low, int high) {//递归DFS dfs(root,low,high); return res; } void dfs(TreeNode root,int low,int high){ if (root !=原创 2020-12-23 15:06:57 · 72 阅读 · 0 评论 -
965单值二叉树
如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。只有给定的树是单值二叉树时,才返回 true;否则返回 false。 public boolean isUnivalTree(TreeNode root) {//BFS框架 boolean flag =true; if (root == null) return true; int tmp = root.val; Queue<TreeNode> queue = new原创 2020-12-23 14:22:45 · 65 阅读 · 0 评论 -
993 二叉树的堂兄弟节点
在二叉树中,根节点位于深度 0 处,每个深度为 k 的节点的子节点位于深度 k+1 处。如果二叉树的两个节点深度相同,但父节点不同,则它们是一对堂兄弟节点。我们给出了具有唯一值的二叉树的根节点 root,以及树中两个不同节点的值 x 和 y。只有与值 x 和 y 对应的节点是堂兄弟节点时,才返回 true。否则,返回 false。Map<Integer,Integer> depth;//用来存节点值和对应的深度 Map<Integer,TreeNode> parent原创 2020-12-23 14:17:10 · 102 阅读 · 0 评论 -
1022 从根到叶的二进制数之和
给出一棵二叉树,其上每个结点的值都是 0 或 1 。每一条从根到叶的路径都代表一个从最高有效位开始的二进制数。例如,如果路径为 0 -> 1 -> 1 -> 0 -> 1,那么它表示二进制数 01101,也就是 13 。对树上的每一片叶子,我们都要找出从根到该叶子的路径所表示的数字。返回这些数字之和。题目数据保证答案是一个 32 位 整数。 int res =0; StringBuilder stringBuilder = new StringBuilder();原创 2020-12-23 14:07:52 · 256 阅读 · 0 评论 -
面试题 0404 最小高度树
给定一个有序整数数组,元素各不相同且按升序排列,编写一个算法,创建一棵高度最小的二叉搜索树。 //因为数组是顺序递增数组,而且又要生成高度平衡的二叉搜索树(排序树),所以需要每次在数组中间取值生成节点,两边的数作为left和right //这里就可以联系到二分查找,每次都找中间的值,然后两边的进行递归 public TreeNode sortedArrayToBST(int[] nums) { int length = nums.length-1; r原创 2020-12-22 21:13:16 · 81 阅读 · 0 评论