思路
方法一:哈希表
周遊整棵樹,找出所有可能的組合,判斷是否存在和為 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 };