题目难度: 中等
原题链接
今天继续更新 Leetcode 的剑指 Offer(专项突击版)系列, 大家在公众号 算法精选 里回复
剑指offer2
就能看到该系列当前连载的所有文章了, 记得关注哦~
给定一棵二叉搜索树和其中的一个节点 p ,找到该节点在树中的中序后继。如果节点没有中序后继,请返回 null 。
节点 p 的后继是值比 p.val 大的节点中键值最小的节点,即按中序遍历的顺序节点 p 的下一个节点。
class Solution:
def inorderSuccessor(self, root: "TreeNode", p: "TreeNode") -> "TreeNode":
# 方法1: 中序遍历
res = None
pre = None
def inorder(cur):
nonlocal res, pre
if not cur:
return
inorder(cur.left)
if pre == p:
# pre是p, 自然cur就是p的中序后继
res = cur
# 更新pre为当前节点, 用于下个节点的判断
pre = cur
inorder(cur.right)
inorder(root)
return res
# 方法2: 二分查找
cur = root
res = None
while cur:
if cur.val > p.val:
if res is None or cur.val < res.val:
# 当前节点是第一个大于p的, 或者它小于res, 更新它为最终结果
res = cur
# 向右子树方向继续查找
cur = cur.left
else:
# 向左子树方向继续查找
cur = cur.right
return res
大家可以在下面这些地方找到我~
我的 GitHub
我的 Leetcode
我的 CSDN
我的知乎专栏
我的头条号
我的牛客网博客
我的公众号: 算法精选, 欢迎大家扫码关注~