112. 路径总和(较难)
112. 路径总和(较难)给你二叉树的根节点 root 和一个表示目标和的整数 targetSum ,判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。
叶子节点 是指没有子节点的节点。
示例 1:输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22输出:true
示例 2:输入:root = [1,2,3], targetSum = 5输出:false
示例 3:输入:root = [1,2], targetSum = 0输出:false
提示:树中节点的数目在范围 [0, 5000] 内-1000 <= Node.val <= 1000-1000 <= targetSum <= 1000
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/path-sum著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:回溯
代码:123456789101112 ...
450. 删除二叉搜索树中的节点(一般)
450. 删除二叉搜索树中的节点(一般)给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。
一般来说,删除节点可分为两个步骤:
首先找到需要删除的节点;如果找到了,删除它。说明: 要求算法时间复杂度为 O(h),h 为树的高度。
示例:
root = [5,3,6,2,4,null,7]key = 3
5
/ \
3 6
/ \ \
2 4 7
给定需要删除的节点值是 3,所以我们首先找到 3 这个节点,然后删除它。
一个正确的答案是 [5,4,6,2,null,null,7], 如下图所示。
5
/ \
4 6
/ \
2 7
另一个正确答案是 [5,2,6,null,4,null,7]。
5
/ \
2 6
\ \
4 7
来源:力扣(LeetCode)链接:https://leetc ...
235. 二叉搜索树的最近公共祖先(一般)
235. 二叉搜索树的最近公共祖先(一般)给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5]
示例 1:输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8输出: 6解释: 节点 2 和节点 8 的最近公共祖先是 6。
示例 2:输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 4输出: 2解释: 节点 2 和节点 4 的最近公共祖先是 2, 因为根据定义最近公共祖先节点可以为节点本身。
说明:所有节点的值都是唯一的。p、q 为不同节点且均存在于给定的二叉搜索树中。
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/lowes ...
501. 二叉搜索树中的众数(一般)
501. 二叉搜索树中的众数(一般)给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素)。
假定 BST 有如下定义:
结点左子树中所含结点的值小于等于当前结点的值结点右子树中所含结点的值大于等于当前结点的值左子树和右子树都是二叉搜索树例如:给定 BST [1,null,2,2],
1 2 / 2返回[2].
提示:如果众数超过1个,不需考虑输出顺序
进阶:你可以不使用额外的空间吗?(假设由递归产生的隐式调用栈的开销不被计算在内)
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/find-mode-in-binary-search-tree
思路:中序遍历产生的数组,众数都在一起,在中序遍历中处理这个逻辑
代码1:1234567891011121314151617181920212223242526272829303132333435363738394041424344class Solution { int crowd = 0; int ...
530/783. 二叉搜索树的最小绝对差(简单)
530/783. 二叉搜索树的最小绝对差(简单)给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值。
示例:
输入:
1 3 / 2
输出:1
解释:最小绝对差为 1,其中 2 和 1 的差的绝对值为 1(或者 2 和 3)。
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/minimum-absolute-difference-in-bst
思路:中序遍历的相邻两个节点的值相差最小的
代码1:1234567891011121314151617181920212223class Solution { TreeNode pre = null; int min = Integer.MAX_VALUE; public int getMinimumDifference(TreeNode root) { //最小两个节点,所以不用判断root==null情况 //绝对值最小的两个节点,一定是中序遍历的相邻两个节点 ...
513. 找树左下角的值(简单)
513. 找树左下角的值(简单)给定一个二叉树,在树的最后一行找到最左边的值。
示例 1:输入:
2
/ \
1 3
输出:
1
示例 2:输入:
1
/ \
2 3
/ / \
4 5 6
/
7
输出:
7
注意: 您可以假设树(即给定的根节点)不为 NULL。
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/find-bottom-left-tree-value
思路:层次遍历
代码1:1234567891011121314151617181920212223242526272829class Solution { public int findBottomLeftValue(TreeNode root) { //题目说了可以假设root不为null //if (root==null){ // return 0; //} //层次遍历 ...
404. 左叶子之和(一般)
404. 左叶子之和(一般)计算给定二叉树的所有左叶子之和。
示例:
3
/ \
9 20
/ \
15 7
在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/sum-of-left-leaves
思路:注意两点:
总和为:左子左叶+右子左叶
左子树的定义
代码:123456789101112131415161718class Solution { public int sumOfLeftLeaves(TreeNode root) { //左子左叶+右子左叶 if(root==null){ return 0; } int left = sumOfLeftLeaves(root.left); int right = sumOfLeftLeaves(root.right); ...
257. 二叉树的所有路径(一般)
257. 二叉树的所有路径(一般)给定一个二叉树,返回所有从根节点到叶子节点的路径。
说明: 叶子节点是指没有子节点的节点。
示例:输入:
1 / 2 3 5
输出: [“1->2->5”, “1->3”]
解释: 所有根节点到叶子节点的路径为: 1->2->5, 1->3
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/binary-tree-paths
思路:回溯
代码:123456789101112131415161718192021222324252627282930313233343536373839class Solution { List<String> res= new ArrayList<>(); List<Integer> tmpath = new ArrayList<>(); public List<String> binaryTreePaths(TreeNode ...
560. 和为K的子数组(一般)
560. 和为K的子数组(一般)给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。
示例 1 :
输入:nums = [1,1,1], k = 2输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。说明 :
数组的长度为 [1, 20,000]。数组中元素的范围是 [-1000, 1000] ,且整数 k 的范围是 [-1e7, 1e7]。
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/subarray-sum-equals-k
思路:前缀和
代码1:1234567891011121314151617181920212223class Solution { public int subarraySum(int[] nums, int k) { //前缀和 int len = nums.length; if(len==0){ return 0; } i ...
222. 完全二叉树的节点个数(简单)
222. 完全二叉树的节点个数(简单)给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。
完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。
示例 1:输入:root = [1,2,3,4,5,6]输出:6
示例 2:输入:root = []输出:0
示例 3:输入:root = [1]输出:1
提示:树中节点的数目范围是[0, 5 * 104]0 <= Node.val <= 5 * 104题目数据保证输入的树是 完全二叉树
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/count-complete-tree-nodes
思路:递归
代码1:12345678class Solution { public int countNodes(TreeNode root) { if(root==null){ ...