例题
二叉搜索树(BST)在二叉树的基础上多了一些条件:在BST中的任何一个子树中,左子树结点的值小于父结点的值,右子树结点的值大于父结点的值。因为BST本身的有序属性,解决一些问题会很方便。
递归法
用递归法来解决这道题,在每一次递归中处理当前结点、以及它的左子树或右子树。根据我们在之前二叉树的递归遍历中记录的方法:
1.确定递归函数的参数和返回值
递归函数的目的是找出值合适的结点并返回,故递归函数的参数为BST的根结点和要搜索的数值val。
2.终止条件
若当前结点的值是要搜索的数值val,那么递归就可以结束了并返回当前访问的结点。
3.确定单层递归的逻辑
每一层递归中,我们判断当前的结点的值是否等于val,若是,递归结束,返回该结点指针;若否,我们将当前结点的值与val进行比较,确定往左子树遍历还是往右子树遍历。
要注意的点是之前的递归函数都是没有返回值的(void),但这题要求返回结点指针结果,所以我们需要用载体来接收递归调用的返回值,最后返回。
code:
class Solution {
public:
TreeNode* searchBST(TreeNode* root, int val) {
TreeNode* res;
if(root == NULL)
return NULL;
if(root->val == val)
return root;
else if(root ->val < val)
res=searchBST(root->right,val);
else
res=searchBST(root->left,val);
return res;
}
};
迭代法
这道题也可以用迭代法来做,创建一个指针来完成二叉搜索法遍历的任务,直接指针为NULL或者指向的结点为目标值为止结束。
code:
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;
}
};