描述
给定一个非空特殊的二叉树,每个节点都是正数,并且每个节点的子节点数量只能为 2 或 0。如果一个节点有两个子节点的话,那么这个节点的值不大于它的子节点的值。
给出这样的一个二叉树,你需要输出所有节点中的第二小的值。如果第二小的值不存在的话,输出 -1 。
示例 1:
输入:
2
/ \
2 5
/ \
5 7
输出: 5
说明: 最小的值是 2 ,第二小的值是 5 。
示例 2:
输入:
2
/ \
2 2
输出: -1
说明: 最小的值是 2, 但是不存在第二小的值。
解析
从左子树和右子树找到一个比node更大的值。如果两个子树分别返回了两个值就取最小的那个。
代码
public int findSecondMinimumValue(TreeNode root) { if (root == null || (root.left == null && root.right == null)) { return -1; } int left = -1; int right = -1; if (root.left != null) { left = root.left.val == root.val ? findSecondMinimumValue(root.left) : root.left.val; } if (root.right != null) { right = root.right.val == root.val ? findSecondMinimumValue(root.right) : root.right.val; } if (left != -1 && right != -1) { return Math.min(left, right); } else if (left != -1) { return left; } else if (right != -1) { return right; } else { return -1; } }
public int findSecondMinimumValue(TreeNode root) { if (root == null || (root.left == null && root.right == null)) { return -1; } List<Integer> list = new ArrayList<>(); findSecondMinimumValueH(root, list, root.val, Integer.MAX_VALUE); if (list.size() <= 0) { return -1; } int min = list.get(0); for (int li : list) { if (li < min) { min = li; } } return min; } public void findSecondMinimumValueH(TreeNode root, List<Integer> list, int minVal, int moreVal) { if (root == null) { return; } if (root.left != null) { int value = root.left.val; if (value > minVal && value <= moreVal) { moreVal = value;//找出第一个大于minVal的值,然后不再继续 list.add(moreVal); } else { findSecondMinimumValueH(root.left, list, minVal, moreVal); } } if (root.right != null) { int value = root.right.val; if (value > minVal && value <= moreVal) { moreVal = value;//找出第一个大于minVal的值,然后不再继续 list.add(moreVal); } else { findSecondMinimumValueH(root.right, list, minVal, moreVal); } } }
这个代码和第一段代码有点区别:记录了所有分支中,第一个大于root.val的值,然后找出最小的,既是第二大的。