leetcode刷题/每日一题 671. 二叉树中第二小的节点

671. 二叉树中第二小的节点

题意:

给定一个非空特殊的二叉树,每个节点都是正数,并且每个节点的子节点数量只能为 2 或 0。如果一个节点有两个子节点的话,那么该节点的值等于两个子节点中较小的一个。

更正式地说,root.val = min(root.left.val, root.right.val) 总成立。

给出这样的一个二叉树,你需要输出所有节点中的第二小的值。如果第二小的值不存在的话,输出 -1 。

示例 1:

img

输入:root = [2,2,5,null,null,5,7]
输出:5
解释:最小的值是 2 ,第二小的值是 5 。

示例 2:

img

输入: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).

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

公仔面i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值