C++Leetcode671:二叉树中第二小的节点

题目
给定一个非空特殊的二叉树,每个节点都是正数,并且每个节点的子节点数量只能为 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));
    }
};

猜你喜欢

转载自blog.csdn.net/weixin_43434305/article/details/88924561