此题解的思路基于二叉搜索树(BST)的中序遍历特性,即中序遍历会按照节点值的升序排列输出所有节点。根据题目要求,我们需要找到节点p的中序后继节点。解决方案分为两种情况:1. 如果节点p有右子节点,则p的后继节点是其右子树中的最左节点。2. 如果节点p没有右子节点,则向上寻找直到找到一个是其父节点的左子节点的节点,该父节点即为后继节点。如果一直向上回溯到根节点还没找到,那么该节点没有后继节点,返回null。
时间复杂度: O(h),h为树的高度
空间复杂度: O(1)
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def inorderSuccessor(self, root: TreeNode, p: TreeNode) -> TreeNode:
if p.right:
# 当节点p有右子节点,寻找其右子树的最左节点
pre, cur = p, p.right
while cur:
pre = cur
cur = cur.left
return pre
else:
# 当节点p无右子节点,向上寻找第一个大于p.val的节点
successor = None
while root:
if p.val < root.val:
successor = root
root = root.left
elif p.val > root.val:
root = root.right
else:
break
return successor