###285. Inorder Successor in BST 题目: 难度: Medium 思路: BST的特性,对于一个node,它的所有左侧node都比它小,它的所有右侧node都比它大。最小的元素在最左边,最大的元素在最右边。 一个node x它的successor y 是满足y > x的最小值。两种情况,如果node x有right child,那么这个right child 中的最小值就是它的successor,否则就要往上走,如果走上去的parent使得这个node是其左边的孩子的话,那么successor我们也找到了。 因为状况可能是这样的: ``` 3 / 1 / \ 0 2 ``` 如果是寻找0的successor,那么我们往上一走,发现0的祖先是1,并且0是1的左孩子,找到,否则如果寻找2的successor,那么我们要往上走到3的部分,2是3的左subtree,这样才能解决问题。 伪码 ``` function Succ(x) if Right(x) ̸= NIL then return Min(Right(x)) else p ← Parent(x) while p ̸= NIL and x = Right(p) do x←p p ← Parent(p) return p ``` 这里伪码有点不适用是因为我们并没有这个parent指针,当然我们还是有trick方式的,就是我们从root开始走,直到找到这个node p,同时我们记录一路上看到的比p.val大的值,这样最后一个就是它的successor.其中最低的那一个就是他的successor. AC代码如下: ``` class Solution(object): def inorderSuccessor(self, root, p): """ :type root: TreeNode :type p: TreeNode :rtype: TreeNode """ def minNode(root): while root.left!= None: root = root.left return root def searchP(p, root): if root == None or root.val == p.val: return None else: succ = None while root != None and p.val != root.val: if p.val < root.val: succ = root root = root.left else: root = root.right return succ if p.right: return minNode(p.right) else: return searchP(p, root) ```