700. 二叉搜索树中的搜索
问题描述:传送门
思路:
关于二叉搜索树,要理清一个概念,它是一个有序树。
- 若它左子树不为空,则左子树上所有节点的值均小于它的根节点的值。
- 若它右子树不为空,则右子树上所有节点的值均大于它的根节点的值。
- 左右子树也是二叉树
1、递归
① 确定递归函数的参数和返回值
参数:传入根节点,以及要搜索的数值。
返回值:以这个搜索数值所在的节点。
代码如下:
TreeNode* searchBST(TreeNode* root, int val)
② 确定终止条件
如果root为空,或者找到这个数值了,就返回root节点。
if (root == NULL || root->val == val)
return root;
③ 确定单层递归的逻辑
因为二叉搜索树的节点是有序的,所以可以有方向的去搜索。
如果root->val>val,那根据条件,搜索左子树。
如果root->bal<val,就搜索右子树。
最后,如果都没有搜索到,就返回NULL。
代码如下:
if (root->val > val)
return searchBST(root->left, val);
// 注意这里加了return
if (root->val < val)
return searchBST(root->right, val);
return NULL;
如果搜索一条边,递归函数就需要加返回值。
完整代码如下:
TreeNode* searchBST(TreeNode* root, int val) {
if (root == NULL || root->val == val) return root;
if (root->val > val) return searchBST(root->left, val);
if (root->val < val) return searchBST(root->right, val);
return NULL;
}
2、迭代法
以查找3为例。
中间节点如果大于3就往左走,如果小于3就往右走。
如下图:
class Solution {
public:
TreeNode* searchBST(TreeNode* root, int val) {
while (root != NULL) {
if (root->val > val) root = root->left;
else if (root->val < val) root = root->right;
else return root;
}
return NULL;
}
};