「这是我参与2022首次更文挑战的第11天,活动详情查看:2022首次更文挑战」。
描述
给定二叉搜索树(BST)的根节点和一个值。 你需要在BST中找到节点值等于给定值的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 NULL。
例如,
给定二叉搜索树:
4
/ \
2 7
/ \
1 3
和值: 2 你应该返回如下子树:
2
/ \
1 3
在上述示例中,如果要找的值是 5,但因为没有节点值为 5,我们应该返回 NULL。
做题
题目给定的二叉搜索树是已经排好序的,比当前节点大的排在右,小的排在左。
这样我们只要判断当前的节点是否比目标值大还是小,大的走左边,小的走右边。
4
/ \
2 7
/ \
1 3
像这里,如果我们找 2,4 比 2 大,走左边;如果我们找7,4 比 7 小,走右边。
如果没有找到目标节点的话,就一直往下,这里就只有深度优先了,广度优先做不了这道题。
递归法
虽说这里是递归,但这里是二分递归,不会全部子节点都去递归。
public TreeNode searchBST(TreeNode root, int val) {
if(root==null || root.val==val){
return root;
}
if(root.val > val){
return searchBST(root.left,val);
}
return searchBST(root.right,val);
}
迭代法
这里的迭代法只是换了个做法,把下一个要遍历的节点放到变量 root 上。解题思路还是和递归法的一样,区别不大。
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;
}
但是内存消耗比递归的高多了,这就很奇怪。
最后
今天就到这里了。
这里是程序员徐小白,【每日算法】是我新开的一个专栏,在这里主要记录我学习算法的日常,也希望我能够坚持每日学习算法,不知道这样的文章风格您是否喜欢,不要吝啬您免费的赞,您的点赞、收藏以及评论都是我下班后坚持更文的动力。