BST20180801.py
def predecessor(self, i):
        '''
        caution: return value maybe None, means i does not have predecessor Node
        '''
#        root = self.root
        if i.l:
            return self.maximum(i.l)
        else:
            y = i.p
            while y and y.l == i:
                i = y
                y = i.p
            return y

        caution: return value maybe None, means i does not have predecessor Node
        
return value maybe None, means i does not have predecessor Node
return value maybe None means i does not have predecessor Node
def predecessor(self, i):
        if i.l:
            return self.maximum(i.l)
        else:
            y = i.p
            while y and y.l == i:
                i = y
                y = i.p
            return y
def predecessor ( self , i ) : if i . l : return self . maximum ( i . l ) else : y = i . p while y and y . l == i : i = y y = i . p return y
caution: return value maybe None, means i does not have predecessor Node
caution : return value maybe None means i does not have predecessor Node
'''
        caution: return value maybe None, means i does not have predecessor Node
        ''' #        root = self.root

self
i