天天看點

LeetCode 653. 兩數之和 IV - 輸入 BST

LeetCode 653. 兩數之和 IV - 輸入 BST

思路

方法一:哈希表

周遊整棵樹,找出所有可能的組合,判斷是否存在和為 k 的一對節點。現在在此基礎上做一些改進。

如果存在兩個元素之和為 k,即 x+y=k,并且已知 x 是樹上一個節點的值,則隻需判斷樹上是否存在一個值為 y 的節點,使得 y=k-x。基于這種思想,在樹的每個節點上周遊它的兩棵子樹(左子樹和右子樹),尋找另外一個比對的數。在周遊過程中,将每個節點的值都放到一個哈希表中。對于每個值為 p 的節點,在哈希表中檢查是否存在 k-p。如果存在,那麼可以在該樹上找到兩個節點的和為 k;否則,将 p 放入到哈希表中。如果周遊完整棵樹都沒有找到一對節點和為 k,那麼該樹上不存在兩個和為 k 的節點。

1 class Solution {
 2 private:
 3     unordered_map<int, bool> mp;
 4 public:
 5     bool findTarget(TreeNode* root, int k) {
 6         if(root == NULL)    
 7             return false;
 8         if(mp.count(k - root->val) == 1)
 9             return true;
10         
11         mp[root->val] = true;
12         return findTarget(root->left, k) || findTarget(root->right, k);
13     }
14 };      
LeetCode 653. 兩數之和 IV - 輸入 BST

方法二:利用BST的性質