题目28:700. 二叉搜索树中的搜索
同类题目
前置知识
二叉搜索树(Binary Search Tree) :也叫做二叉查找树、有序二叉树或者排序二叉树。是指一棵空树或者具有下列性质的二叉树:
- 如果任意节点的左子树不为空,则左子树上所有节点的值均小于它的根节点的值。
- 如果任意节点的右子树不为空,则右子树上所有节点的值均大于它的根节点的值。
- 任意节点的左子树、右子树均为二叉搜索树。
题目描述
-
给定二叉搜索树(BST)的根节点
root和一个整数值val。你需要在 BST 中找到节点值等于
val的节点。 返回以该节点为根的子树。 如果节点不存在,则返回null。示例 1:
输入:root = [4,2,7,1,3], val = 2 输出:[2,1,3]示例 2:
输入:root = [4,2,7,1,3], val = 5 输出:[]提示:
- 树中节点数在
[1, 5000]范围内 1 <= Node.val <= 107root是二叉搜索树1 <= val <= 107
- 树中节点数在
思路分析
递归法
二叉搜索树的查找步骤
在二叉搜索树中查找值为 val 的节点,步骤如下
-
如果二叉搜索树为空,返回空指针
nullptr。 -
如果二叉搜索树不为空,将值
val与二叉搜索树根节点的值root.val进行比较- 如果
val==root.val,返回被查找到的节点。 - 如果
val<root.val,递归查找左子树。 - 如果
val>root.val,递归查找右子树。
- 如果
程序代码
方法一:
// https://leetcode.cn/problems/search-in-a-binary-search-tree/description/
// 700. 二叉搜索树中的搜索
#include<iostream>
#include<vector>
using namespace std;
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode() : val(0), left(nullptr), right(nullptr) {}
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};
class Solution {
public:
TreeNode* searchBST(TreeNode* root, int val) {
if(root == nullptr || root->val == val)
{
return root;
}
if(root->val > val)
{
return searchBST(root->left,val);
}else
{
return searchBST(root->right,val);
}
return nullptr;
}
};
复杂度分析
时间复杂度:O(N),一共有 N个节点,最坏情况下二叉搜索树是一条链,且要找的元素比链末尾的元素值还要小(大),这种情况下我们需要递归N次。
空间复杂度:O(N) ,递归栈的开销占用 O(N)。
思路分析
迭代法
对于二叉搜索树使用迭代法巨爽无比,因为二叉搜索树节点是有序性,可以不使用辅助栈或者队列。
普通二叉树,递归搜索的过程中需要有回溯的过程,因为,从一个方向递归到头后找不到,那么就需要回头走另一个分支方向。
程序代码
方法二:
class Solution {
public:
TreeNode* searchBST(TreeNode* root, int val) {
while(root != nullptr)
{
if(root->val > val)
{
root = root->left;
}else if(root->val < val)
{
root = root->right;
}else
{
return root;
}
}
return nullptr;
}
};
复杂度分析
时间复杂度:O(N),一共有 N个节点,hash 占用 O(N),递归占用O(N)。
空间复杂度:O(1) 。
更多相关知识:github.com/pingguo1987…