LeetCode 二叉搜索树中的搜索

题目

  给定二叉搜索树(BST)的根节点和一个值。 你需要在BST中找到节点值等于给定值的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 NULL。

示例

给定搜索值2和一棵二叉搜索树:

        4
       / \
      2   7
     / \
    1   3
你应该返回如下子树:
	  2     
     /  \   
    1    3
在上述示例中,如果要找的值是 5,但因为没有节点值为 5,我们应该返回 NULL。

解法


一、递归( Python )
class Solution:
    def searchBST(self, root: TreeNode, val: int) -> TreeNode:
        res = None
        if(root == None):
            return None
        if(root.val == val):
            res = root
        elif val < root.val:
            res = self.searchBST(root.left, val)
        else:
            res = self.searchBST(root.right, val)
        return res
基本思路

  首先题目指明了是二叉搜索树(BST),那么要熟悉二叉搜索树的性质:左节点不大于父节点,右节点不小于父节点。然后要安排好本题的基准情形root == Noneroot.val == val,接着就可以按照val的大小决定递归左子树还是右子树。

复杂度分析

  时间复杂度为 O ( N ) O \left( N \right) O(N),因为最差情况为二叉树中每个节点只有单子节点,需要遍历所有节点。但是如果是满二叉树,则每次前进会将二叉树一分为二,最差情况为 O ( l o g N ) O \left( logN \right) O(logN)。空间上最差情况也是在二叉树为线性树时,为 O ( N ) O \left( N \right) O(N),递归调用了N次,对于满二叉树,最差情况递归次数等于树的高度,为 O ( l o g N ) O \left( logN \right) O(logN)

二、迭代 ( Python )
class Solution:
    def searchBST(self, root: 'TreeNode', val: 'int') -> 'TreeNode':
        node = root
        while node != None and node.val != val:
            if val < node.val:
                node = node.left
            else:
                node = node.right    
        return node
基本思路

  因为每次都会基于val对左右子树进行选择,只会有一个孩子节点需要被访问,所以这里的迭代不需要用栈来保存所有孩子节点,用一个变量node即可。

复杂度分析

  时间复杂度在二叉树为线性树时,最差为 O ( N ) O \left( N \right) O(N),在二叉树为满节点树时最差为 O ( l o g N ) O \left( logN \right) O(logN)。空间上只用了一个变量Node,复杂度为 O ( 1 ) O \left( 1 \right) O(1)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值