题目
给定一个非空特殊的二叉树,每个节点都是正数,并且每个节点的子节点数量只能为 2 或 0。如果一个节点有两个子节点的话,那么这个节点的值不大于它的子节点的值。
给出这样的一个二叉树,你需要输出所有节点中的第二小的值。如果第二小的值不存在的话,输出 -1 。
示例 1:
输入:
输出: 5
说明: 最小的值是 2 ,第二小的值是 5 。
示例 2:
输入:
输出: -1
说明: 最小的值是 2, 但是不存在第二小的值。
思路
1、暴力解法。前序遍历二叉树,将值存入一个动态数组中,再从小到大排序数组,最后遍历数组,输出第二小的值。
2、递归。分别向左右子树递归,找到出现第一次大于根结点的值,然后输出其中的较小的值。
实现方法
一、暴力解法
/**
* 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) {
vector<int> res;
preOrder(root,res);
sort(res.begin(),res.end());
for(int i=0;i<res.size()-1;i++){
if(res[i+1]>res[i])
return res[i+1];
}
return -1;
}
void preOrder(TreeNode* root,vector<int>& res){
if(root){
res.push_back(root->val);
preOrder(root->left,res);
preOrder(root->right,res);
}
}
};
二、递归
/**
* 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) {
return find(root,root->val);
}
int find(TreeNode* root,int val){
if(!root) return -1;
if(root->val>val) return root->val;
if(find(root->left,val)<0) return(find(root->right,val));
if(find(root->right,val)<0) return(find(root->left,val));
return min(find(root->left,val),find(root->right,val));
}
};