230. 二叉搜索树中第K小的元素(一般)
230. 二叉搜索树中第K小的元素(一般)给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 个最小元素(从 1 开始计数)。
示例 1:
输入:root = [3,1,4,null,2], k = 1输出:1
示例 2:
输入:root = [5,3,6,2,4,null,null,1], k = 3输出:3
提示:
树中的节点数为 n
1 <= k <= n <= 104
0 <= Node.val <= 104
进阶:如果二叉搜索树经常被修改(插入/删除操作)并且你需要频繁地查找第 k 小的值,你将如何优化算法?
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/kth-smallest-element-in-a-bst
思路1:常规的中序遍历就是按序输出
思路2:可以将复杂度降到logN2
https://mp.weixin.qq.com/s/ioyqagZLYrvdlZyOMDjrPw
代码:12345678910111213141516171819 ...
652. 寻找重复的子树(较难)
652. 寻找重复的子树(较难)给定一棵二叉树,返回所有重复的子树。对于同一类的重复子树,你只需要返回其中任意一棵的根结点即可。
两棵树重复是指它们具有相同的结构以及相同的结点值。
示例 1:
1
/ \
2 3
/ / \
4 2 4
/
4
下面是两个重复的子树:
2
/
4
和
4
因此,你需要以列表的形式返回上述重复子树的根结点。
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/find-duplicate-subtrees
思路:二叉树,递归
需要知道自己这个节点的子树什么样子,也就是左子树+右子树+自己就是自己的子树的样子,也就是后序遍历的框架,和计算二叉树的节点个数一样,表示子树可以用序列化的样子,将二叉树表示成字符串
https://mp.weixin.qq.com/s/LJbpo49qppIeRs-FbgjsSQ
代码1:123456789101112131415161718192021222324class Solution { public ...
106. 从中序与后序遍历序列构造二叉树(一般)
106. 从中序与后序遍历序列构造二叉树(一般)根据一棵树的中序遍历与后序遍历构造二叉树。
注意:你可以假设树中没有重复的元素。
例如,给出
12中序遍历 inorder = [9,3,15,20,7]后序遍历 postorder = [9,15,7,20,3]
返回如下的二叉树:
3
/ \
9 20
/ \
15 7
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/construct-binary-tree-from-inorder-and-postorder-traversal/
思路1:类比105
代码1:12345678910111213141516171819202122232425262728293031323334353637383940/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * ...
654. 最大二叉树(一般)
654. 最大二叉树(一般)给定一个不含重复元素的整数数组 nums 。一个以此数组直接递归构建的 最大二叉树 定义如下:
二叉树的根是数组 nums 中的最大元素。左子树是通过数组中 最大值左边部分 递归构造出的最大二叉树。右子树是通过数组中 最大值右边部分 递归构造出的最大二叉树。返回有给定数组 nums 构建的 最大二叉树 。
示例 1:
输入:nums = [3,2,1,6,0,5]输出:[6,3,5,null,2,0,null,null,1]解释:递归调用如下所示:
[3,2,1,6,0,5] 中的最大值是 6 ,左边部分是 [3,2,1] ,右边部分是 [0,5] 。
[3,2,1] 中的最大值是 3 ,左边部分是 [] ,右边部分是 [2,1] 。
空数组,无子节点。
[2,1] 中的最大值是 2 ,左边部分是 [] ,右边部分是 [1] 。
空数组,无子节点。
只有一个元素,所以子节点是一个值为 1 的节点。
[0,5] 中的最大值是 5 ,左边部分是 [0] ,右边部分是 [] 。
只有一个元素,所以子节点是一个值为 0 的节点。
空数组,无子节点。
...
116. 填充每个节点的下一个右侧节点指针(简单)
116. 填充每个节点的下一个右侧节点指针(简单)给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:
123456struct Node { int val; Node *left; Node *right; Node *next;}
填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。
初始状态下,所有 next 指针都被设置为 NULL。
进阶: 你只能使用常量级额外空间。 使用递归解题也符合要求,本题中递归程序占用的栈空间不算做额外的空间复杂度。
示例:
输入:root = [1,2,3,4,5,6,7]输出:[1,#,2,3,#,4,5,6,7,#]解释:给定二叉树如图 A 所示,你的函数应该填充它的每个 next 指针,以指向其下一个右侧节点,如图 B 所示。序列化的输出按层序遍历排列,同一层节点由 next 指针连接,’#’ 标志着每一层的结束。
提示:树中节点的数量少于 4096-1000 <= nod ...
62. 不同路径(一般)
62. 不同路径(一般)一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。
问总共有多少条不同的路径?
示例 1:输入:m = 3, n = 7输出:28
示例 2:输入:m = 3, n = 2输出:3解释:从左上角开始,总共有 3 条路径可以到达右下角。
向右 -> 向下 -> 向下
向下 -> 向下 -> 向右
向下 -> 向右 -> 向下
示例 3:输入:m = 7, n = 3输出:28
示例 4:输入:m = 3, n = 3输出:6
提示:1 <= m, n <= 100题目数据保证答案小于等于 2 * 109
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/unique-paths
思路:我们用 f(i, j)表示从左上角走到 (i,j) 的路径数量,其中 i 和 j的范围分别是 [0,m) 和 [0,n)。
由于我们每 ...
448. 找到所有数组中消失的数字(简单)
448. 找到所有数组中消失的数字(简单)给定一个范围在 1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次。
找到所有在 [1, n] 范围之间没有出现在数组中的数字。
您能在不使用额外空间且时间复杂度为O(n)的情况下完成这个任务吗? 你可以假定返回的数组不算在额外空间内。
示例:
输入:[4,3,2,7,8,2,3,1]
输出:[5,6]
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/find-all-numbers-disappeared-in-an-array
思路:据题目特点,可以把数组中的元素与索引建立一一对应的关系。因为索引是确定的0到n-1,一个也不缺,而数组的元素不确定,少了哪个也不知道。既然两者是一一对应的关系,那么我们对数组中的每个元素对应的索引做个标记;然后再对索引进行一次遍历,那么不存的元素就不会对它对应的索引进行比较,由此可查找出这些不存在的元素。
遍历每个元素,对索引进行标记将对应索引位置的值变为负数;
遍历下索引,看看哪些索引位置 ...
17. 电话号码的字母组合(一般)
17. 电话号码的字母组合(一般)给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例:
输入:"23"输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].说明:尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number
思路:排列树,回溯
代码:1234567891011121314151617181920212223242526272829303132333435363738394041class Solution { publ ...
11. 盛最多水的容器(简单)
11. 盛最多水的容器(简单)给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
说明:你不能倾斜容器。
示例 1:
输入:[1,8,6,2,5,4,8,3,7]输出:49解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。
示例 2:输入:height = [1,1]输出:1
示例 3:输入:height = [4,3,2,1,4]输出:16
示例 4:输入:height = [1,2,1]输出:2
提示:n = height.length2 <= n <= 3 * 1040 <= height[i] <= 3 * 104
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/container-with-most-water
思路:这 ...
114. 二叉树展开为链表(简单)
114. 二叉树展开为链表(简单)给定一个二叉树,原地将它展开为一个单链表。
例如,给定二叉树
1
/ \
2 5
/ \ \
3 4 6
将其展开为:
12345678910111 \ 2 \ 3 \ 4 \ 5 \ 6
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/flatten-binary-tree-to-linked-list
思路:分为三步:
首先将根节点的左子树变成链表
其次将根节点的右子树变成链表
最后将变成链表的右子树放在变成链表的左子树的最右边这就是一个递归的过程,递归的一个非常重要的点就是:不去管函数的内部细节是如何处理的,我们只看其函数作用以及输入与输出。对于函数flatten来说:
函数作用:将一个二叉树,原地将它展开为链表输入:树的根节点输出:无那我们就直接根据三步来写程序就可以了
作者:Geralt_U链接:https://leetcode-cn.com/prob ...