LC.700 | 二叉搜索树中的搜索 | 树 | 利用BST有序性

输入:
二叉搜索树的根节点 root 和一个整数 val

要求:
在 BST 中找到节点值等于 val 的节点,并返回以该节点为根的子树。如果要找的节点不存在,返回 null

输出:
目标节点的指针 TreeNode*


思路:

二叉搜索树(BST)的核心特性是:左 < 根 < 右。这使得我们在树上的搜索过程类似于二分查找,不需要遍历整棵树。

  1. 递归逻辑(主解法):

    • 终止条件:如果当前节点为空(没找到)或者当前节点值等于目标值(找到了),直接返回当前节点。
    • 利用性质
      • 如果 val < root->val:说明目标在左子树,递归调用 searchBST(root->left, val)
      • 如果 val > root->val:说明目标在右子树,递归调用 searchBST(root->right, val)
  2. 迭代逻辑(注释写法):

    • 对于 BST 的搜索,迭代法其实更加高效且直观,因为它不需要维护递归栈。
    • 使用 while 循环,根据大小关系不断移动 root 指针指向左孩子或右孩子,直到找到或者 root 变为 null

复杂度:

  • 时间复杂度:O(h) 树高
  • 空间复杂度:O(h) 树高

class Solution {
public:
    //找到了不必提 直接返回即可
    //找不到的标准是什么呢 就是右子树的最小节点比你 左子树的最大节点比你小 中间也不等于 这样就是不存在
    //问题是什么呢 递归查找怎么写...
    TreeNode* searchBST(TreeNode* root, int val) {
        if (!root) {
            return nullptr;
        }
        if (root->val == val) {
            return root;
        }
        else if (root->val > val) {
            return searchBST(root->left, val);
        }
        else {
            return searchBST(root->right, val);
        }
    }
    /*
    //while循环写法
    while (!isFind) {
        if (!root) {
            ans = nullptr;
            isFind = true;
        }
        else if (root->val == val) {
            ans = root;
            isFind = true;
        }
        else if (root->val > val) {
            root = root->left;
        }
        else {
            root = root->right;
        }
    }
    */
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值