# 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: ```expander tag:#DFS OR tag:#BFS ``` - [[Breadth First Search]] - [[Leetcode Binary-Tree-Inorder-Traversal]] - [[Leetcode Binary-Tree-Level-Order-Traversal]] - [[Leetcode Binary-Tree-Postorder-Traversal]] - [[Leetcode Binary-Tree-Preorder-Traversal]] - [[Leetcode Insert-Into-a-Binary-Search-Tree]] - [[Leetcode Invert-Binary-Tree]] - [[Leetcode Lowest-Common-Ancestor-Of-a-Binary-Search-Tree]] - [[Leetcode Maximum-Depth-Of-Binary-Tree]] - [[Leetcode Path-Sum]] - [[Leetcode Symmetric-Tree]] - [[Leetcode Two-Sum-IV-Input-Is-a-BST]] - [[Leetcode Validate-Binary-Search-Tree]] ##### 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; } }; ```