Inorder Successor
https://leetcode.com/problems/inorder-successor-in-bst-ii/
这道题求解下一个比当前node值大的node,只有两种情况。
第一个比当前node大的parent (具体画画就知道了)当前node在向上找parent时很可能一直在parent的右子树里面,找到第一个它在左子树里的parent就是我们要找的parent
当前node的right subtree里面最小的那个node
class Solution(object):
def inorderSuccessor(self, node):
"""
:type node: Node
:rtype: Node
"""
v = node.val
if node.right:
node = node.right
while node.left:
node = node.left
return node
while node.parent and node.val <= v:
node = node.parent
if node.val <= v:
return None
return node
这是在有parent的情况下。如果没有parent就如如下情况。
class Solution:
def inorderSuccessor(self, root: 'TreeNode', p: 'TreeNode') -> 'TreeNode':
if p.right:
node = p.right
while node.left:
node = node.left
return node
res = None
while root:
if root.val > p.val:
res = root
root = root.left
else:
root = root.right
return res
这里我们每找到一个root root.val > p.val 我们都assume这是我们找到的最后一个比p大的父并用res记录它
另一个解法,leftMost解法 + prev
class Solution:
def inorderSuccessor(self, root: 'TreeNode', p: 'TreeNode') -> 'TreeNode':
if p.right:
p = p.right
while p.left:
p = p.left
return p
stack = []
prev = float("-inf")
while stack or root:
while root:
stack.append(root)
root = root.left
root = stack.pop()
if prev == p.val:
return root
prev = root.val
root = root.right
return None
Last updated
Was this helpful?