【树-中等】剑指 Offer II 053. 二叉搜索树中的中序后继

题目
给定一棵二叉搜索树和其中的一个节点 p ,找到该节点在树中的中序后继。如果节点没有中序后继,请返回 null 。

节点 p 的后继是值比 p.val 大的节点中键值最小的节点,即按中序遍历的顺序节点 p 的下一个节点。

示例 1:

输入:root = [2,1,3], p = 1
输出:2
解释:这里 1 的中序后继是 2。请注意 p 和返回值都应是 TreeNode 类型。

示例 2:

输入:root = [5,3,6,2,4,null,null,1], p = 6
输出:null
解释:因为给出的节点没有中序后继,所以答案就返回 null 了。

提示:

树中节点的数目在范围 [1, 104] 内。
-105 <= Node.val <= 105
树中各节点的值均保证唯一。

注意:本题与主站 285 题相同
【代码】
在这里插入图片描述

class Solution:
    def dfs(self,root,p):
        if not root:
            return
        self.dfs(root.left,p)
        self.ans.append(root)
        if root.val==p.val:
            self.index=len(self.ans)
        self.dfs(root.right,p)
    def inorderSuccessor(self, root: 'TreeNode', p: 'TreeNode') -> 'TreeNode':
        self.ans=[]
        self.index=-1
        self.dfs(root,p)
        return self.ans[self.index] if self.index<len(self.ans) else None

【方法2】
在这里插入图片描述

class Solution:
    def dfs(self,root,p):
        if not root:
            return
        self.dfs(root.left,p)
        if self.flag==1:
            self.ans=root
            self.flag+=1

        if root.val==p.val:
            self.flag+=1

        self.dfs(root.right,p)
    def inorderSuccessor(self, root: 'TreeNode', p: 'TreeNode') -> 'TreeNode':
        self.ans=None
        self.flag=0
        self.dfs(root,p)
        return self.ans

おすすめ

転載: blog.csdn.net/kz_java/article/details/119786619