700 Search in a binary search tree
一共三种解法,
- recursive solution of DFS
- iterative solution of DFS with stack
- iterative solution of BFS with queue
Approach 1 Recursion
base case: 也就是当我们traverse到了None的时候, 直接返回None即可. 如果val等于root.val, 那么直接返回root即可, 找到答案了.
recursive case: 利用BST的性质, 如果val小于root.val, 那么我们就去左边找, 如果val大于root.val, 那么我们就去右边找.
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def searchBST(self, root: Optional[TreeNode], val: int) -> Optional[TreeNode]:
# base case
if not root:
return root
# 用return None也可以, 但这里root就是None, 所以直接返回root即可
# return None
if val == root.val:
return root
if val < root.val:
# go to some place smaller
return self.searchBST(root.left,val)
else:
return self.searchBST(root.right,val)
Approach 2 Iterative solution of DFS with stack
这题甚至不需要用stack, 因为只需要一个pointer 看比较value就可以了. 其它涉及到DFS的题目, 一般都需要stack, 因为需要记录走过的路径, 但这题不需要.
Code Implementation
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def searchBST(self, root: Optional[TreeNode], val: int) -> Optional[TreeNode]:
curr = root
while curr:
if curr.val == val:
return curr
elif curr.val < val:
curr = curr.right
else:
curr = curr.left
return None
Approach 3 Iterative solution of BFS with queue
Code: 暴力BFS
暴力的Breadth First Search, 不利用binary search tree的性质.
from collections import deque
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def searchBST(self, root: Optional[TreeNode], val: int) -> Optional[TreeNode]:
queue = deque([root])
while queue:
curr = queue.pop()
if curr.val == val:
return curr
if curr.left:
queue.append(curr.left)
if curr.right:
queue.append(curr.right)
return None
Code: BFS利用BST性质做pruning
利用BST性质做一些pruning,
from collections import deque
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def searchBST(self, root: Optional[TreeNode], val: int) -> Optional[TreeNode]:
queue = deque([root])
while queue:
curr = queue.pop()
if curr.val == val:
return curr
if curr.val > val and curr.left:
queue.append(curr.left)
if curr.val < val and curr.right:
queue.append(curr.right)
return None