[LeetCode] Second Minimum Node In a Binary Tree 二叉树中第二小的结点
Given a non-empty special binary tree consisting of nodes with the non-negative value, where each node in this tree has exactly two or zero sub-node. If the node has two sub-nodes, then this node's value is the smaller value among its two sub-nodes.
Given such a binary tree, you need to output the second minimum value in the set made of all the nodes' value in the whole tree.
If no such second minimum value exists, output -1 instead.
Example 1:
Input:
2
/ \
2 5
/ \
5 7 Output: 5
Explanation: The smallest value is 2, the second smallest value is 5.
Example 2:
Input:
2
/ \
2 2 Output: -1
Explanation: The smallest value is 2, but there isn't any second smallest value.
这道题让我们找二叉树中的第二小的结点值,并且给该二叉树做了一些限制,比如对于任意一个结点,要么其没有子结点,要么就同时有两个子结点,而且父结点值是子结点值中较小的那个,当然两个子结点值可以相等。那么直接上暴力搜索呗,根据该树的附加条件可知,根结点一定是最小的结点值first,那么我们只要找出第二小的值second即可,初始化为整型的最大值。然后对根结点调用递归函数,将first和second当作参数传进去即可。在递归函数中,如果当前结点为空,直接返回,若当前结点孩值不等于first,说明其肯定比first要大,然后我们看其是否比second小,小的话就更新second,然后对当前结点的左右子结点分别调用递归函数即可,参见代码如下:
解法一:
class Solution {
public:
int findSecondMinimumValue(TreeNode* root) {
int first = root->val, second = INT_MAX;
helper(root, first, second);
return (second == first || second == INT_MAX) ? - : second;
}
void helper(TreeNode* node, int& first, int& second) {
if (!node) return;
if (node->val != first && node->val < second) {
second = node->val;
}
helper(node->left, first, second);
helper(node->right, first, second);
}
};
下面这种方法也是用递归来做的,不过现在递归函数有了返回值,在递归函数中,还是先判断当前结点是否为空,为空直接返回-1。然后就是看当前结点是否等于first,不等于直接返回当前结点值。如果等于,我们对其左右子结点分别调用递归函数,分别得到left和right。如果left和right其中有一个为-1了,我们取其中的较大值;如果left和right都不为-1,我们取其中的较小值返回即可,参见代码如下:
解法二:
class Solution {
public:
int findSecondMinimumValue(TreeNode* root) {
return helper(root, root->val);
}
int helper(TreeNode* node, int first) {
if (!node) return -;
if (node->val != first) return node->val;
int left = helper(node->left, first), right = helper(node->right, first);
return (left == - || right == -) ? max(left, right) : min(left, right);
}
};
下面这种递归方法更加简洁了,没有再使用专门的递归函数helper,而是对当前根结点判断其左子树是否存在,不存在就返回-1。题目中说了是非空树,所以根结点一定存在。然后我们比较如果左子结点值等于根结点值,我们则对其左子结点调用递归函数;否则left就等于其左子结点值。再比较如果右子结点值等于根结点值,则对其右子结点调用递归函数;否则right就等于其右子结点值。最后我们还是看如果left和right其中有一个为-1了,我们取其中的较大值;如果left和right都不为-1,我们取其中的较小值返回即可,参见代码如下:
解法三:
class Solution {
public:
int findSecondMinimumValue(TreeNode* root) {
if (!root->left) return -;
int left = (root->left->val == root->val) ? findSecondMinimumValue(root->left) : root->left->val;
int right = (root->right->val == root->val) ? findSecondMinimumValue(root->right) : root->right->val;
return (left == - || right == -) ? max(left, right) : min(left, right);
}
};
整了三种递归的解法,来看一种迭代的解法吧,用的是层序遍历,但还是用的解法一种的不停更新second的方法,参见代码如下:
解法四:
class Solution {
public:
int findSecondMinimumValue(TreeNode* root) {
int first = root->val, second = INT_MAX;
queue<TreeNode*> q{{root}};
while (!q.empty()) {
auto t = q.front(); q.pop();
if (t->val != first && t->val < second) {
second = t->val;
}
if (t->left) q.push(t->left);
if (t->right) q.push(t->right);
}
return (second == first || second == INT_MAX) ? - : second;
}
};
类似题目:
参考资料:
https://discuss.leetcode.com/topic/102277/java-4-lines
https://discuss.leetcode.com/topic/102027/c-dfs-recursion
https://discuss.leetcode.com/topic/102035/bfs-acc-solution-java-and-c-code
LeetCode All in One 题目讲解汇总(持续更新中...)
[LeetCode] Second Minimum Node In a Binary Tree 二叉树中第二小的结点的更多相关文章
- LeetCode 671. Second Minimum Node In a Binary Tree二叉树中第二小的节点 (C++)
题目: Given a non-empty special binary tree consisting of nodes with the non-negative value, where eac ...
- Leetcode671.Second Minimum Node In a Binary Tree二叉树中的第二小结点
给定一个非空特殊的二叉树,每个节点都是正数,并且每个节点的子节点数量只能为 2 或 0.如果一个节点有两个子节点的话,那么这个节点的值不大于它的子节点的值. 给出这样的一个二叉树,你需要输出所有节点中 ...
- [LeetCode] Closest Leaf in a Binary Tree 二叉树中最近的叶结点
Given a binary tree where every node has a unique value, and a target key k, find the value of the n ...
- LeetCode Second Minimum Node In a Binary Tree
原题链接在这里:https://leetcode.com/problems/second-minimum-node-in-a-binary-tree/description/ 题目: Given a ...
- LeetCode 671. Second Minimum Node In a Binary Tree
Given a non-empty special binary tree consisting of nodes with the non-negative value, where each no ...
- LeetCode 671. 二叉树中第二小的节点(Second Minimum Node In a Binary Tree) 9
671. 二叉树中第二小的节点 671. Second Minimum Node In a Binary Tree 题目描述 给定一个非空特殊的二叉树,每个节点都是正数,并且每个节点的子节点数量只能为 ...
- 【Leetcode_easy】671. Second Minimum Node In a Binary Tree
problem 671. Second Minimum Node In a Binary Tree 参考 1. Leetcode_easy_671. Second Minimum Node In a ...
- Java实现 LeetCode 671 二叉树中第二小的节点(遍历树)
671. 二叉树中第二小的节点 给定一个非空特殊的二叉树,每个节点都是正数,并且每个节点的子节点数量只能为 2 或 0.如果一个节点有两个子节点的话,那么这个节点的值不大于它的子节点的值. 给出这样的 ...
- 【LeetCode】671. Second Minimum Node In a Binary Tree 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 找出所有值再求次小值 遍历时求次小值 日期 题目地址 ...
随机推荐
- [poj3254]Corn Fields_状压dp
Corn Fields poj3254 题目大意:给你一个n*m的地,每一块地可以种或不种,两块种过的地不能挨着,可以一块都不种,问所有的种地方案数. 注释:读入用0和1,1<=n,m<= ...
- New UWP Community Toolkit - RadialGauge
概述 New UWP Community Toolkit V2.2.0 的版本发布日志中提到了 RadialGauge 的调整,本篇我们结合代码详细讲解 RadialGauge 的实现. Radi ...
- Build to win--来自小黄衫
写在前面 首先非常荣幸.非常侥幸能以微弱的优势得到这次小黄衫,感谢各位老师同学的帮助,也谢谢来自<构建之法>团队的小黄衫赞助! 这次能够获得小黄衫,就像汪老师上课说的那样,其实,是一个积累 ...
- mobiscroll2.5.4 日期组件
<script type="text/javascript"> function setCss(o) { $('input:jqmData(role="dat ...
- Alpha冲刺Day5
Alpha冲刺Day5 一:站立式会议 今日安排: 首先由于经过黄腾飞短暂的测试,发现导入导出仍然有一些问题,今天需要进行完善 由黄腾飞负责企业自查风险管理子模块,要求为单元进行风险点的管理 由张梨贤 ...
- 多线程里面的关键字,wait, notfiy, 锁(synchronized), lock接口
多线程环境下,必须考虑线程同步的问题,这是因为多个线程同时访问变量或者资源时会有线程争用,比如A线程读取了一个变量,B线程也读取了这个变量,然后他们同时对这个变量做了修改,写回到内存中,由于是同时做修 ...
- 用C#(.NET Core) 实现简单工厂和工厂方法模式
本文源自深入浅出设计模式. 只不过我是使用C#/.NET Core实现的例子. 前言 当你看见new这个关键字的时候, 就应该想到它是具体的实现. 这就是一个具体的类, 为了更灵活, 我们应该使用的是 ...
- 安装 go 语言环境
操作系统: CentOS 6.9_x64 go语言版本: 1.8.3 安装go 这里直接安装二进制,其它方式请自行搜索. 1.下载并安装go 命令如下: ? 1 2 3 wget https://st ...
- api-gateway实践(15)API网关的待改进点 20171207
一.API网关能力 API网关负责服务请求路由.组合及协议转换.客户端的所有请求都首先经过API网关,然后由它将请求路由到合适的微服务.API网关的客户端通过统一的网关接入微服务,在网关层处理所有的非 ...
- redis入门(05)redis的key命令
一.什么是redis键命令 Redis 键(key):Redis 键命令用于管理 redis 的键. Redis 键命令的基本语法: redis 127.0.0.1:6379> COMMAND ...