给定一个非空特殊的二叉树,每个节点都是正数,并且每个节点的子节点数量只能为 2
或 0
。如果一个节点有两个子节点的话,那么这个节点的值不大于它的子节点的值。
给出这样的一个二叉树,你需要输出所有节点中的第二小的值。如果第二小的值不存在的话,输出 -1 。
示例 1:
输入: 2 / \ 2 5 / \ 5 7 输出: 5 说明: 最小的值是 2 ,第二小的值是 5 。
示例 2:
输入: 2 / \ 2 2 输出: -1 说明: 最小的值是 2, 但是不存在第二小的值。
题目标签:Tree
题目链接:LeetCode / LeetCode中国
C++里set
的特点是:不重复,按元素大小存放。因此,可以把元素放在set
里,然后利用迭代器取出第2个元素即可。
这题的二叉树比较特殊,本来考虑使用广度遍历,然后当set
里元素不少于2个时就不继续,结果发现出错了!这个测试用例是:[1,1,3,1,1,3,4,3,1,1,1,3,8,4,8,3,3,1,6,2,1]。该测试用例的特点是:根与一个子节点相等,但是,第二小的元素位于该子节点的子树里,按照这种策略就会漏掉这种情况。
不考虑那么多,直接遍历,AC。
Language | Runtime | Memory |
---|---|---|
cpp | 0 ms | N/A |
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int findSecondMinimumValue(TreeNode* root) {
if(!root){
return -1;
}
queue<TreeNode*> seq;
set<TreeNode*> vt;
set<int> nums;
vt.insert(root);
seq.push(root);
while(!seq.empty()){
TreeNode* node = seq.front();
seq.pop();
nums.insert(node->val);
if(node->left && !vt.count(node->left)){
vt.insert(node->left);
seq.push(node->left);
}
if(node->right && !vt.count(node->right)){
vt.insert(node->right);
seq.push(node->right);
}
}
if(nums.size() > 1){
auto it = nums.begin();
return *(next(it));
}else{
return -1;
}
}
};