""" because of the special porperty of the tree, the question basically is asking to find the smallest element in the subtree of root. So, we can recursively find left and right value that is not equal to the root's value, and then return the smaller one of them """ def findSecondMinimumValue(self, root): if not root: return -1 if not root.left and not root.right: return -1 left, right = root.left.val, root.right.val if left == root.val: left = self.findSecondMinimumValue(root.left) if right == root.val: right = self.findSecondMinimumValue(root.right) if left != -1 and right != -1: return min(left, right) if left == -1: return right if right == -1: return left