开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第28天,点击查看活动详情
阳了,艰难更文中~~~,如写得不够详细,敬请谅解
LeetCode 700. 二叉搜索树中的搜索
一、题目描述:
给定二叉搜索树(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 <= 10^7
root 是二叉搜索树
1 <= val <= 10^7
来源:力扣(LeetCode)
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、思路分析:
-
这道题考察了什么思想?你的思路是什么?
-
理解题意:
- 题目给出一根二叉搜索树(Binary Search Tree,BST),和一个值
- BST 的特征:左子树的值 < 根结点的值 < 右子树的值;根节点的每一个左右子树都是一颗 BST
- 在给定的 BST 中找出是这个值的根节点
-
整体思路:
- 根据 BST 的特征,可以用类似于二分查找法来解题,每一次递归都只需要去左右子树中的一个中寻找
- 当目标值小于根结点的值时需要去左子树中寻找
- 当目标值大于根节点的值时需要去右子树中寻找
-
-
做题的时候是不是一次通过的,遇到了什么问题,需要注意什么细节?
是一次通过的
-
有几种解法,哪种解法时间复杂度最低,哪种解法空间复杂度最低,最优解法是什么?其他人的题解是什么,谁的效率更好一些?用不同语言实现的话,哪个语言速度最快?
func searchBST(root *TreeNode, val int) *TreeNode { for root != nil { if val == root.Val { return root } if val < root.Val { root = root.Left } else { root = root.Right } } return nil } 作者:LeetCode-Solution 链接:https://leetcode.cn/problems/search-in-a-binary-search-tree/solution/er-cha-sou-suo-shu-zhong-de-sou-suo-by-l-d8zi/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
三、AC 代码:
class Solution {
public TreeNode searchBST(TreeNode root, int val) {
if (root == null) return null;
if (root.val == val){
// 找到目标值
return root;
} else if (val < root.val) {
// 目标值在左子树中
return searchBST(root.left, val);
} else {
// 目标值在右子树中
return searchBST(root.right, val);
}
}
}
四、总结:
这道题目还是比较简单的,是常见的数据结构题目。在二叉搜索树中搜索值。
模板来源:
作者:掘金酱
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。