671. 二叉树中第二小的节点
题意:
给定一个非空特殊的二叉树,每个节点都是正数,并且每个节点的子节点数量只能为 2 或 0。如果一个节点有两个子节点的话,那么该节点的值等于两个子节点中较小的一个。
更正式地说,root.val = min(root.left.val, root.right.val) 总成立。
给出这样的一个二叉树,你需要输出所有节点中的第二小的值。如果第二小的值不存在的话,输出 -1 。
示例 1:
输入:root = [2,2,5,null,null,5,7]
输出:5
解释:最小的值是 2 ,第二小的值是 5 。
示例 2:
输入:root = [2,2,2]
输出:-1
解释:最小的值是 2, 但是不存在第二小的值。
解题思路:
问 答 题目意思? 获取全部节点的值,里面排第二小的那个 怎么获取全部节点的值? **遍历全部节点.**无论什么方式 怎么获取第二小的值? 遍历的节点值保存在一个容器,全部完成后容器排序,选第二小的返回 用什么容器? 需要排序,那么就用set,这样不用自己排序. 什么时候没有第二小的值? set会去重,如果set的大小小于2,那么就是没有第二小的值 到这时,就可以完成题目了,只需要对树进行遍历,然后每个值都压入set容器中,遍历结束后判断set容器的大小,如果小于2就返回-1,否则就返回第二个数据即可.
代码:
if (!root)
return -1;
queue<TreeNode *>que;
set<int> se;
//层序遍历
que.push(root);
while (!que.empty())
{
//压入数据
se.emplace(que.front()->val);
if (que.front()->left)
que.push(que.front()->left);
if (que.front()->right)
que.push(que.front()->right);
que.pop();
}
//如果容器大小小于2,说明没有第二小的值
if (se.size() < 2)
{
return -1;
}
return *(++se.begin());
总结:
题目难度并不大,借助于容器特点可以轻松完成.时间复杂度是O(n).