求二叉树中第二小的节点。二叉树每个节点要么是叶子节点要么有两个子节点,并且父节点的值一定小于等于两个子节点的值(注意这里是两个子节点的值大于等于根节点的值,而不是子树)
方法1 DFS遍历+双变量
遍历二叉树的所有节点 ,然后不断更新最小值和次小值。但这样的方法没有用到题目给的其他条件
class Solution1:
def findSecondMinimumValue(self, root):
if root == None:
return -1
first_min = root.val
second_min = float("inf")
stack = [root]
while(stack):
node = stack.pop()
if node.val < first_min:
second_min = first_min
first_min = node.val
elif first_min < node.val < second_min:
second_min = node.val
if node.left:
stack.append(node.left)
if node.right:
stack.append(node.right)
return -1 if second_min == float("inf") else second_min
方法2 分治算法
最小值肯定是root,如果root的left或right值等于root值,那就要递归的去找对应节点下的次小值,然后次小值中选最大,没有次小则返回-1
class Solution2:
def findSecondMinimumValue(self, root):
if root == None:
return -1
if root.left == None and root.right == None:
return -1
left = root.left.val
right = root.right.val
if root.val == left:
left = self.findSecondMinimumValue(root.left)
if root.val == right:
right = self.findSecondMinimumValue(root.right)
if left != -1 and right != -1:
return min(left, right)
else:
return left if right == -1 else right