LC 0510 [M] Inorder Successor in BST II - ALawliet/algorithms GitHub Wiki
naive solution
"""
# Definition for a Node.
class Node:
def __init__(self, val):
self.val = val
self.left = None
self.right = None
self.parent = None
"""
class Solution:
def inorderSuccessor(self, p: 'Node') -> 'Optional[Node]':
# find root
root = None
cur = p
while cur.parent:
cur = cur.parent
root = cur
# inorder successor of p in BST given root
self.successor = None
def inorder(node):
if not node: return None
inorder(node.left)
if node.val > p.val:
if not self.successor or node.val < self.successor.val:
self.successor = node
inorder(node.right)
inorder(root)
return self.successor
1. node has a right child, then its successor is its leftmost leaf node
2. node has no right child, then its successor must be the nearest ancestor who has it as a left child (thanks to BST property)
successor
/
node
3. no successor if none of the above two cases hold
class Solution:
def inorderSuccessor(self, node: 'Node') -> 'Node':
if node.right:
node = node.right
while node.left:
node = node.left
return node
while node.parent:
if node.parent.left == node:
return node.parent
node = node.parent
return None
alternative loop
while node.parent and node.parent.val < node.val:
node = node.parent
return node.parent