# Leetcode Search-In-a-Binary-Tree #### 2022-07-07 08:06 > ##### Algorithms: > > #algorithm #DFS #BFS > > ##### Data structures: > > #DS #binary_tree > > ##### Difficulty: > > #coding_problem #difficulty_easy > > ##### Additional tags: > > #leetcode > > ##### Revisions: > > N/A ##### Related topics: ##### Links: - [Link to problem](https://leetcode.com/problems/search-in-a-binary-search-tree/submissions/) --- ### Problem You are given the `root` of a binary search tree (BST) and an integer `val`. Find the node in the BST that the node's value equals `val` and return the subtree rooted with that node. If such a node does not exist, return `null`. #### Examples Example 1: Input: root = [4,2,7,1,3], val = 2 Output: [2,1,3] Example 2: Input: root = [4,2,7,1,3], val = 5 Output: [] #### Constraints - The number of nodes in the tree is in the range `[1, 5000]`. - `1 <= Node.val <= 107` - `root` is a binary search tree. - `1 <= val <= 107` ### Thoughts > [!summary] > This is a #DFS or #BFS problem. We search values in the tree. In DFS, I use preorder, since the root value will be check first, making it quicker if data appear on shallow trees more. In BFS, I don't have use for loop inside while loop, since we don't have to consider levels. ### Solution DFS ```cpp /** * 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: TreeNode *searchBST(TreeNode *root, int val) { // DFS preorder // Base cases if (!root) { return nullptr; } if (root->val == val) { return root; } auto left = searchBST(root->left, val); if (left) { return left; } auto right = searchBST(root->right, val); if (right) { return right; } // left and right not found return nullptr; } }; ``` Which can be simplified to ```cpp /** * 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: TreeNode* searchBST(TreeNode* root, int val) { // DFS preorder // Base cases if (!root) { return nullptr; } if (root->val == val) { return root; } auto left = searchBST(root->left, val); if (left) { return left; } return searchBST(root->right, val); } }; ``` BFS ```cpp /** * 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: TreeNode *searchBST(TreeNode *root, int val) { // BFS queue pending; pending.push(root); TreeNode *ptr; while (!pending.empty()) { ptr = pending.front(); pending.pop(); if (ptr->val == val) { return ptr; } if (ptr->left) pending.push(ptr->left); if (ptr->right) pending.push(ptr->right); } return nullptr; } }; ```