题目
给定二叉搜索树(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 == None
和root.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)。