设计一个算法,找出二叉搜索树中指定节点的“下一个”节点(也即中序后继)。
如果指定节点没有对应的“下一个”节点,则返回null。
示例 1:
输入: root = [2,1,3], p = 1
2
/ \
1 3
输出: 2
示例 2:
输入: root = [5,3,6,2,4,null,null,1], p = 6
5
/ \
3 6
/ \
2 4
/
1
输出: null
通过次数23,712提交次数40,005
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/successor-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
方法一:中序遍历
现在左子树中寻找p的下一个节点,如果没有就判断根节点,如果根节点不是那么一定在右节点中,在右子树中寻找然后返回值。
根据二叉搜索树的性质,当p.val>root.val的时候,可以直接把左子树剪掉。
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
pre=None
def inorderSuccessor(self, root: TreeNode, p: TreeNode) -> TreeNode:
if not root:
return None
"""
r=self.inorderSuccessor(root.left,p)
if r:
return r
"""
if root.val>p.val:
r=self.inorderSuccessor(root.left,p)
if r:
return r
if self.pre==p:
return root
self.pre=root
r=self.inorderSuccessor(root.right,p)
if r:
return r
return None
方法二:二分法(学习的)
二分法其实和中序遍历思路差不多,题目要求找到p的下一个节点,那么就是在比p大的子树中找到一个最小的节点,所以这样代码就好写了。
(大佬nb)
作者:ga-beng-cui-7
链接:https://leetcode-cn.com/problems/successor-lcci/solution/er-fen-fa-olognshi-jian-o1kong-jian-by-ga-beng-cui/
# 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:
res=None
cur=root
while cur:
if cur.val<=p.val:
cur=cur.right
else:
res=cur
cur=cur.left
return res