|  | @@ -0,0 +1,40 @@
 | 
	
		
			
				|  |  | +/**
 | 
	
		
			
				|  |  | + * Definition for a binary tree node.
 | 
	
		
			
				|  |  | + * type TreeNode struct {
 | 
	
		
			
				|  |  | + *     Val int
 | 
	
		
			
				|  |  | + *     Left *TreeNode
 | 
	
		
			
				|  |  | + *     Right *TreeNode
 | 
	
		
			
				|  |  | + * }
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  | +func findSecondMinimumValue(root *TreeNode) int {
 | 
	
		
			
				|  |  | +	if root == nil {
 | 
	
		
			
				|  |  | +		return -1
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	return helper(root, root.Val)
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +func helper(root *TreeNode, min int) int {
 | 
	
		
			
				|  |  | +	if root.Left == nil {
 | 
	
		
			
				|  |  | +		return -1
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	var l, r int
 | 
	
		
			
				|  |  | +	if root.Left.Val == min {
 | 
	
		
			
				|  |  | +		l = helper(root.Left, min)
 | 
	
		
			
				|  |  | +	} else {
 | 
	
		
			
				|  |  | +		l = root.Left.Val
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	if root.Right.Val == min {
 | 
	
		
			
				|  |  | +		r = helper(root.Right, min)
 | 
	
		
			
				|  |  | +	} else {
 | 
	
		
			
				|  |  | +		r = root.Right.Val
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	switch {
 | 
	
		
			
				|  |  | +	case l == -1:
 | 
	
		
			
				|  |  | +		return r
 | 
	
		
			
				|  |  | +	case r == -1:
 | 
	
		
			
				|  |  | +		return l
 | 
	
		
			
				|  |  | +	case r < l:
 | 
	
		
			
				|  |  | +		return r
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	return l
 | 
	
		
			
				|  |  | +}
 |