携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第23天,点击查看活动详情
一、题目
LeetCode 二叉搜索树中的搜索
给定二叉搜索树(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 <= 107
root 是二叉搜索树
1 <= val <= 107
二、题解
给定有一个二叉搜索树,二叉搜索树又叫二叉排序树就说是节点值有序的,如果左子树不为空的话,那么左子树的所有节点值都小于根节点的值,如果右子树不为空的话,那么右子树的所有节点值都大于根节点的值,对于子树也是这个样子。需要找到二叉搜索树中节点值为val的节点,然后返回以这个节点为二叉搜索树的子树,如果不存在这个节点返回null。
方法一
对此可以直接遍历二叉树来寻找目标节点值为val的节点,这里可以通过dfs深度优先搜索来遍历,同时基于二叉搜索树的特性,我们可以判断节点值来尽量减少搜索。具体的递归的判断如果root节点为空就直接返回null,否则判断当前节点值是否与目标节点值val相等,如果相等则直接返回当前节点,否则需要继续递归遍历,这时可以判断当前节点值与目标值val的大小关系,如果当前节点值大于目标值val,则需要到左子树中继续寻找即可;如果当前节点值小于目标值val,则需要到右子树中继续寻找即可。
方法二
对此只需要往某个节点的某个子树下遍历,所以可以直接遍历,即循环遍历root树节点,如果当前节点root不为空的话,就判断当前节点root与目标节点值val是否相等,如果相等则直接返回root,否则判断当前节点值与目标值val的大小关系,如果当前节点值大于目标值val则继续到左子树中遍历寻找,如果当前节点值小于目标值val则继续到右子树中遍历寻找。
三、代码
方法一 Java代码
class Solution {
public TreeNode searchBST(TreeNode root, int val) {
if (root == null) {
return null;
}
if (root.val == val) {
return root;
}
return searchBST(root.val > val ? root.left : root.right, val);
}
}
时间复杂度:O(n),需要遍历一次二叉树节点,有可能会遍历所有节点。
空间复杂度:O(n),递归消耗的栈空间。
方法二 Java代码
class Solution {
public TreeNode searchBST(TreeNode root, int val) {
while (root != null) {
if (root.val == val) {
return root;
}
root = root.val > val ? root.left : root.right;
}
return null;
}
}
时间复杂度:O(n),需要遍历一次二叉树节点,有可能会遍历所有节点。
空间复杂度:O(1),只需使用常数的空间。