持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第6天,点击查看活动详情
力扣653. 两数之和 IV - 输入 BST
一、题目描述:
给定一个二叉搜索树 root 和一个目标结果 k,如果 BST 中存在两个元素且它们的和等于给定的目标结果,则返回 true。
示例 1:
输入: root = [5,3,6,2,4,null,7], k = 9
输出: true
示例 2:
输入: root = [5,3,6,2,4,null,7], k = 28
输出: false
提示:
二叉树的节点个数的范围是 [1, 10^4].
-10^4 <= Node.val <= 10^4
root 为二叉搜索树
-10^5 <= k <= 10^5
来源:力扣(LeetCode) 链接:leetcode.cn/problems/tw… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、思路分析:
-
这道题考察了什么思想?你的思路是什么?
思路很简单,遍历二叉搜索树将其保存到哈希表中,同时每次都在哈希表中寻找k-x是否存在。如果存在就找到,不存在就将其添加到哈希表呗!!!
-
做题的时候是不是一次通过的,遇到了什么问题,需要注意什么细节?
不是,对C语言的哈希表操作不熟练。
-
有几种解法,哪种解法时间复杂度最低,哪种解法空间复杂度最低,最优解法是什么?其他人的题解是什么,谁的效率更好一些?用不同语言实现的话,哪个语言速度最快?
深搜和广搜都行。也可以迭代 + 中序遍历 + 双指针。
func findTarget(root *TreeNode, k int) bool {
left, right := root, root
leftStk := []*TreeNode{left}
for left.Left != nil {
leftStk = append(leftStk, left.Left)
left = left.Left
}
rightStk := []*TreeNode{right}
for right.Right != nil {
rightStk = append(rightStk, right.Right)
right = right.Right
}
for left != right {
sum := left.Val + right.Val
if sum == k {
return true
}
if sum < k {
left = leftStk[len(leftStk)-1]
leftStk = leftStk[:len(leftStk)-1]
for node := left.Right; node != nil; node = node.Left {
leftStk = append(leftStk, node)
}
} else {
right = rightStk[len(rightStk)-1]
rightStk = rightStk[:len(rightStk)-1]
for node := right.Left; node != nil; node = node.Right {
rightStk = append(rightStk, node)
}
}
}
return false
}
作者:LeetCode-Solution
链接:https://leetcode.cn/problems/two-sum-iv-input-is-a-bst/solution/liang-shu-zhi-he-iv-shu-ru-bst-by-leetco-b4nl/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
三、AC 代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
typedef struct {
int key;
UT_hash_handle hh;
} HashItem;
bool helper(const struct TreeNode* root, int k, HashItem ** hashTable) {
if (root == NULL) {
return false;
}
int key = k - root->val;
HashItem * pEntry = NULL;
HASH_FIND_INT(*hashTable, &key, pEntry);
if (pEntry != NULL) {
return true;
}
pEntry = (HashItem *)malloc(sizeof(HashItem));
pEntry->key = root->val;
HASH_ADD_INT(*hashTable, key, pEntry);
return helper(root->left, k, hashTable) || helper(root->right, k, hashTable);
}
bool findTarget(struct TreeNode* root, int k){
HashItem * hashTable = NULL;
return helper(root, k, &hashTable);
}
四、总结:
我们要掌握C语言哈希表的用法!!!!!