Created
November 17, 2023 02:21
-
-
Save braddotcoffee/9bed5ccd41a469b7e4fb35a567542db9 to your computer and use it in GitHub Desktop.
235. Lowest Common Ancestor of a Binary Search Tree
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Definition for a binary tree node. | |
# class TreeNode: | |
# def __init__(self, x): | |
# self.val = x | |
# self.left = None | |
# self.right = None | |
""" | |
We need to binary search until we find our node p and our node q | |
- generate a set of nodes we've seen while looking for p | |
- find q | |
- as we come back up, check to see if we've seen that node finding p | |
""" | |
class Solution: | |
def build_seen_nodes(self, node: 'TreeNode', seen: set[int], target_val: int): | |
seen.add(node.val) | |
if target_val == node.val: | |
return | |
if target_val < node.val: | |
return self.build_seen_nodes(node.left, seen, target_val) | |
self.build_seen_nodes(node.right, seen, target_val) | |
def find_lowest_common(self, node: 'TreeNode', seen: set[int], target_val: int): | |
if target_val == node.val: | |
return target_val in seen, node | |
if target_val < node.val: | |
found, lowest_common = self.find_lowest_common(node.left, seen, target_val) | |
else: | |
found, lowest_common = self.find_lowest_common(node.right, seen, target_val) | |
if found: | |
return found, lowest_common | |
return node.val in seen, node | |
def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode': | |
p_seen_nodes = set() | |
self.build_seen_nodes(root, p_seen_nodes, p.val) | |
_, lowest_common = self.find_lowest_common(root, p_seen_nodes, q.val) | |
return lowest_common |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment