package com.fanlu.leetcode.binarytree;
// Source : https://leetcode.com/problems/second-minimum-node-in-a-binary-tree/
// Id : 671
// Author : Fanlu Hai
// Date : 2018-04-23
// Other : Long result =Long.valueOf(Integer.MAX_VALUE)+1; Long.valueOf(Integer.MAX_VALUE+1) will result in Integer.MIN
// Tips :
import java.util.PriorityQueue;
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
// to do
public class SecondMinimumNodeInABinaryTree {
//Long result =Long.valueOf(Integer.MAX_VALUE)+1;
Long result = Long.MAX_VALUE;
//100.00% 93.19%
public int findSecondMinimumValue(TreeNode root) {
if (null == root || null == root.left)
return -1;
int min = root.val;
dfs(root, min);
if (result == min)
return -1;
if (result == Long.MAX_VALUE)
return -1;
return result.intValue();
}
public void dfs(TreeNode node, int min) {
if (null == node)
return;
if (node.val != min && node.val < result) {
result = Long.valueOf(node.val);
}
dfs(node.left, min);
dfs(node.right, min);
}
PriorityQueue queue = new PriorityQueue();
// 5% 93%
public int findSecondMinimumValueThinkTooLess(TreeNode root) {
preorderTraverse(root);
if (queue.isEmpty() || queue.size() == 1)
return -1;
int min = queue.poll();
System.out.println(min);
while (!queue.isEmpty()) {
int second = queue.poll();
System.out.println(second);
if (second == min) {
continue;
}
return second;
}
return -1;
}
public void preorderTraverse(TreeNode node) {
if (null == node)
return;
queue.add(node.val);
preorderTraverse(node.left);
preorderTraverse(node.right);
}
}