使用dfs遍历树,将遍历结果加入集合中,如果集合中存在与当前节点值之和为目标值的元素,返回true
/** * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * }; */ class Solution { private: bool dfs(TreeNode* root, unordered_set<int>& st, int k) { if (!root) { return false; } if (st.find(k - root->val) != st.end()) { return true; } st.insert(root->val); return dfs(root->left, st, k) || dfs(root->right, st, k); } public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param root TreeNode类 * @param k int整型 * @return bool布尔型 */ bool findTarget(TreeNode* root, int k) { unordered_set<int> st; return dfs(root, st, k); } };
时间复杂度:在最坏情况下,需要遍历整棵二叉搜索树,时间复杂度为 O(n),其中 n 为树中节点的数量。
空间复杂度:
使用了一个整型无序集合 st 来存储节点值,最坏情况下需要存储所有节点的值,空间复杂度为 O(n);
递归调用时,需要考虑函数调用栈的空间,最坏情况下递归深度为树的高度,空间复杂度为 O(h),其中 h 为树的高度。