653. 两数之和 IV - 输入 BST
难度简单386收藏分享切换为英文接收动态反馈
给定一个二叉搜索树 root
和一个目标结果 k
,如果 BST 中存在两个元素且它们的和等于给定的目标结果,则返回 true
。
示例 1:
1 | 输入: root = [5,3,6,2,4,null,7], k = 9 |
示例 2:
1 | 输入: root = [5,3,6,2,4,null,7], k = 28 |
提示:
- 二叉树的节点个数的范围是
[1, 104]
. -104 <= Node.val <= 104
root
为二叉搜索树-105 <= k <= 105
题解:
解法1:DFS + 哈希表
通过DFS来遍历整棵树,用哈希表记录遍历过的结点值。
对于一个值为x
的节点,只要检查哈希表中是否存在k - x
即可。
如果找到存在对应的元素,则返回true。
否则,将当前结点值存入哈希表。
代码如下:
1 | //深度优先搜索+哈希表 |
- 时间复杂度:O(N),需要遍历整棵树
- 空间复杂度:O(N),最坏情况需要一个存储整棵树所有结点值的哈希表
解法2:BFS + 哈希表
原理同解法1,只是遍历方式不同
代码如下:
1 | public boolean findTarget(TreeNode root, int k) { |
- 时间复杂度:O(N),需要遍历整棵树
- 空间复杂度:O(N),最坏情况需要一个存储整棵树所有结点值的哈希表和队列
解法3:DFS + 中序遍历 + 双指针
二叉搜索树的中序遍历结果是一个递增序列,可以遍历得到整棵树的结点值,然后使用双指针找到是否有两数之和等于目标值的元素。如果两数之和大于目标值,右指针左移;如果两数之和小于目标值,左指针右移。
代码如下:
1 | public boolean findTarget(TreeNode root, int k) { |
- 时间复杂度:O(N),需要遍历整棵树
- 空间复杂度:O(N),需要一个存储整棵树所有结点值的集合