【面试题 04.06. 后继者】

设计一个算法,找出二叉搜索树中指定节点的“下一个”节点(也即中序后继)。

如果指定节点没有对应的“下一个”节点,则返回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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值