给定一个非空特殊的二叉树,每个节点都是正数,并且每个节点的子节点数量只能为 2 或 0。如果一个节点有两个子节点的话,那么该节点的值等于两个子节点中较小的一个。
更正式地说,root.val = min(root.left.val, root.right.val) 总成立。
给出这样的一个二叉树,你需要输出所有节点中的第二小的值。如果第二小的值不存在的话,输出 -1 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/second-minimum-node-in-a-binary-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
int findSecondMinimumValue(TreeNode* root) {
// 转化为求左右子树的最小值
return dfs(root, root->val);
}
int dfs(TreeNode* root, int value) {
// 叶节点
if (!root) {
return -1;
}
// 若当前节点值>根节点,则直接返回它的值
if (root->val > value) {
return root->val;
}
// 否则当前节点值必等于根节点
// 此时要在左右子树寻找目标节点
int l = dfs(root->left, value);
int r = dfs(root->right, value);
// 若左右子树均存在大于最小值的节点,则返回较小的那个,因为要的是第二小
if (l > 0 && r > 0) {
return min(l, r);
}
// 否则返回较大的那个
return max(l, r);
}
};