题目描述:
示例 1:
示例 2:
思路一:
代码实现:
class Solution {
Set<Integer> set = new TreeSet();
public int findSecondMinimumValue(TreeNode root) {
dfs(root);
if (set.size() <= 1) {
return -1;
}
List<Integer> list = new ArrayList(set);
return list.get(1);
}
public void dfs(TreeNode root) {
if (root == null) {
return;
}
set.add(root.val);
if (root.left != null) {
dfs(root.left);
}
if (root.right != null) {
dfs(root.right);
}
}
}
思路二:
代码实现:
class Solution {
public int result = -1;
public int findSecondMinimumValue(TreeNode root) {
dfs(root, root.val);
return result;
}
public void dfs(TreeNode node, int rootVal) {
if (node == null) {
return;
}
// 根结点是二叉树中最小的节点,如果node.val大于result,
// 则代表以node.val为根节点的二叉树所有元素都大于result,直接返回
if (result != -1 && node.val >= result) {
return;
}
if (node.val > rootVal) {
result = result == -1 ? node.val : Math.min(result, node.val);
}
dfs(node.left, rootVal);
dfs(node.right, rootVal);
}
}
思路三:
代码实现:
class Solution {
public int result = -1;
public int findSecondMinimumValue(TreeNode root) {
bfs(root, root.val);
return result;
}
public void bfs(TreeNode node, int rootVal) {
if (node == null) {
return;
}
Queue<TreeNode> queue = new LinkedList();
queue.offer(node);
while (!queue.isEmpty()) {
TreeNode cur = queue.poll();
if (cur.val != rootVal)
result = result == -1 ? cur.val : Math.min(result, cur.val);
if (cur.left != null) {
queue.offer(cur.left);
queue.offer(cur.right);
}
}
}
}