LeetCode(653) - Two Sum IV - Input is a BST

문제

Binary Search Tree의 root node 와 정수 k가 주어진다. BST정수 중 두 정수를 조합하여 k를 만들 수 있다면 true를, 아니라면 false를 반환하라.

입력

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

출력

Output: true

풀이

  1. set은 key의 유일성을 보장하며, 고유한 key 검색 시 O(1)의 시간복잡도를 가진다. k - 특정 노드 값이면, 나머지 값에 대해 검색연산을 수행하여 값을 찾을 수 있다.
  2. BST를 순회하면서 각 노드의 숫자들을 set 에 저장한다.
  3. set을 순회하면서 k - node->val의 값이 set에 있다면 true를 아니라면 false를 반환한다.

코드

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    set<int> st;

    void traverseTree(TreeNode* cur) {
        if (cur->left != NULL) {
            traverseTree(cur->left);
        }
        if (cur->right != NULL) {
            traverseTree(cur->right);
        }
        st.insert(cur->val);
    }
    bool findTarget(TreeNode* root, int k) {
        traverseTree(root);
        if (st.size() == 1)    return false;

        int diff = 0;
        for (int itr : st) {
            if (itr > (k /2 )) {
                return false;
            }
            
            diff = k - itr;
            auto found = st.find(diff);

            if (found == st.end())  {
                continue;
            }
            if (*found != itr) {
                return true;
            }
        }
        return false;
    }
};