力扣653. 两数之和 IV - 输入 BST

151 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第6天,点击查看活动详情

力扣653. 两数之和 IV - 输入 BST

一、题目描述:

给定一个二叉搜索树 root 和一个目标结果 k,如果 BST 中存在两个元素且它们的和等于给定的目标结果,则返回 true。

示例 1:

img

输入: root = [5,3,6,2,4,null,7], k = 9

输出: true

示例 2:

img

输入: 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… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、思路分析:

  1. 这道题考察了什么思想?你的思路是什么?

    思路很简单,遍历二叉搜索树将其保存到哈希表中,同时每次都在哈希表中寻找k-x是否存在。如果存在就找到,不存在就将其添加到哈希表呗!!!

  2. 做题的时候是不是一次通过的,遇到了什么问题,需要注意什么细节?

    不是,对C语言的哈希表操作不熟练。

  3. 有几种解法,哪种解法时间复杂度最低,哪种解法空间复杂度最低,最优解法是什么?其他人的题解是什么,谁的效率更好一些?用不同语言实现的话,哪个语言速度最快?

    深搜和广搜都行。也可以迭代 + 中序遍历 + 双指针。

image.png

     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);
 }
 ​

四、总结:

653. 两数之和 IV - 输入 BST

我们要掌握C语言哈希表的用法!!!!!