给定一棵特殊的二叉树:每个节点有0个或者2个子节点,且如果某节点有两个子节点,那么该节点的值与其最小的子节点相等。如下面的特殊二叉树,其第二小的节点为5.
方法一:由给定的条件,可知根节点肯定是值最小的节点,所以这个问题就是找子树中与根节点不相等的最小值。
public int findSecondMinimumValue(TreeNode root) {
if(root == null || root.left == null)
return -1;
return find(root, root.val);
}
public int find(TreeNode root, int min){
if(root.left == null)
return root.val == min ? -1 : root.val;
int leftMin = find(root.left, min);
int rightMin = find(root.right, min);
if(leftMin == -1 || rightMin == -1)
return Math.max(leftMin, rightMin);
else return Math.min(leftMin, rightMin);
}
方法二:把所有元素存入集合TreeSet(自动排序、不重复)中,集合中的值是按从小到大排序的,只需要输出集合中的第二个值即可。
public int findSecondMinimumValue(TreeNode root) {
if ((root == null) || (root.left == null && root.right == null))
return -1;
Set<Integer> set = new TreeSet<>();
dfs(root, set);
Iterator<Integer> it = set.iterator();
it.next();
return (it.hasNext()) ? it.next() : -1;
}
private void dfs(TreeNode root, Set<Integer> set) {
if (root == null) return;
set.add(root.val);
dfs(root.left, set);
dfs(root.right, set);
}