二叉搜索树中的搜索

力扣题目地址(opens new window)

给定二叉搜索树(BST)的根节点和一个值。 你需要在BST中找到节点值等于给定值的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 NULL。

例如,

700.二叉搜索树中的搜索

在上述示例中,如果要找的值是 5,但因为没有节点值为 5,我们应该返回 NULL

什么是二叉搜索树?

二叉搜索树是一个有序树:

  • 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
  • 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
  • 它的左、右子树也分别为二叉搜索树

如何遍历二叉搜索树?

上述二叉搜索树的性质决定了其递归遍历和迭代遍历和普通二叉树都不一样

递归

不同归不同,还是要遵守三步走的

1、确定递归函数的参数和返回值

在本题中,可以直接使用解题模板

class Solution {
public:
    TreeNode* searchBST(TreeNode* root, int val) {

    }
};

即输入为根节点和待搜索的值

2、确定终止条件

因为是递归遍历嘛,如果根节点(即每次递归时的当前节点)为空或者找到目标值则递归结束

class Solution {
public:
    TreeNode* searchBST(TreeNode* root, int val) {
        //确定终止条件
		if(root == NULL && root->val == val) return root;
    }
};

3、确定单层处理逻辑

这里就与普通二叉树遍历有区别了

因为二叉搜索树的节点是有顺序的,我们可以有针对性的去搜索

如果当前节点的值大于目标值(root->val > val),那么就去搜索左子树(因为当前root的左子树中所有值都小于root的值,因此有可能有匹配val的节点)

如果当前节点的值小于目标值(root->val < val),那么就去搜索右子树

class Solution {
public:
    TreeNode* searchBST(TreeNode* root, int val) {
        //确定终止条件
		if(root == NULL && root->val == val) return root;
        
        //当前节点的值大于目标值,去搜索左子树
        if(root->val > val) res = searchBST(root->left, val);
        if(root->val < val) res = searchBST(root->right, val);
        return res;
    }
};
迭代

由于二叉搜索树已经排好序,我们可以不使用辅助栈或者队列就可以写出迭代法

例如要搜索元素为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;//找到就返回root

        }
        return NULL;//没找到
    }
};

注意点

1、二叉搜索树,左小右大(左子树降序排,根节点最大;右子树升序,根节点最小)

2、迭代法依旧要使用while遍历,只是逻辑简单了