lintcode915题目链接
注意 这是BST 所以root.left一定小于root root.right一定大于root
那么 中序 左中右 一定是递增序列
所以p的前驱就是比p小一个的—
所以p的前驱一定是p的左子结点 或者 p的左父结点
那么如何找呢?
1 p的前驱是p的左子结点 p.val<=root.val
我们会一直遍历到p 并且会多root.left一次也就是刚好到p的前继
多root.left一次刚好使得 root=p.left pre=root
2 p的前驱是p的左父结点 p.val>root.val
pre = root
root = root.right 直到p.val=root.val
此时pre就为root的左父结点
class Solution:
"""
@param root: the given BST
@param p: the given node
@return: the in-order predecessor of the given node in the BST
"""
def inorderPredecessor(self, root, p):
pre = None
while root:
if root.val >= p.val:###我们会一直遍历到p 并且会多root.left一次也就是刚好到p的前继
root = root.left
else:###多root.left一次刚好使得 root=p.left
pre = root
root = root.right
return pre