输入:
二叉搜索树的根节点 root 和一个整数 val。
要求:
在 BST 中找到节点值等于 val 的节点,并返回以该节点为根的子树。如果要找的节点不存在,返回 null。
输出:
目标节点的指针 TreeNode*。
思路:
二叉搜索树(BST)的核心特性是:左 < 根 < 右。这使得我们在树上的搜索过程类似于二分查找,不需要遍历整棵树。
-
递归逻辑(主解法):
- 终止条件:如果当前节点为空(没找到)或者当前节点值等于目标值(找到了),直接返回当前节点。
- 利用性质:
- 如果
val < root->val:说明目标在左子树,递归调用searchBST(root->left, val)。 - 如果
val > root->val:说明目标在右子树,递归调用searchBST(root->right, val)。
- 如果
-
迭代逻辑(注释写法):
- 对于 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;
}
}
*/
};
453

被折叠的 条评论
为什么被折叠?



