zoukankan      html  css  js  c++  java
  • leetcode 671. 二叉树中第二小的节点

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

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

    示例 1:

    输入: 
        2
       / 
      2   5
         / 
        5   7
    
    输出: 5
    说明: 最小的值是 2 ,第二小的值是 5 。
    

    示例 2:

    输入: 
        2
       / 
      2   2
    
    输出: -1
    说明: 最小的值是 2, 但是不存在第二小的值。

    解题思路:
    •   遍历所有结点,把所有结点的值保存在一个数组中
    • 把数组中重复值去掉
    • 找出去重数组中的第二小值
    • 去重后的数组可能不存在第二小值,要分别讨论
     1 /**
     2  * Definition for a binary tree node.
     3  * struct TreeNode {
     4  *     int val;
     5  *     TreeNode *left;
     6  *     TreeNode *right;
     7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     8  * };
     9  */
    10 #include<algorithm>
    11 #include<queue>
    12 class Solution {
    13 public:
    14     int findSecondMinimumValue(TreeNode* root) {
    15         queue<TreeNode*> v;
    16         vector<int> ans;
    17         v.push(root);
    18         while(!v.empty()){
    19             TreeNode* temp = v.front();
    20             ans.push_back(temp->val);
    21             v.pop();
    22             if(temp->left != NULL) v.push(temp->left);
    23             if(temp->right != NULL) v.push(temp->right);
    24         }
    25         sort(ans.begin(), ans.end());
    26         ans.erase(unique(ans.begin(), ans.end()), ans.end());
    27         if(ans.size()>1) return ans[1];
    28         else return -1;
    29     }
    30 };
    有疑惑或者更好的解决方法的朋友,可以联系我,大家一起探讨。qq:1546431565
  • 相关阅读:
    Poj 2017 Speed Limit(水题)
    Poj 1316 Self Numbers(水题)
    Poj 1017 Packets(贪心策略)
    Poj 1017 Packets(贪心策略)
    Poj 2662,2909 Goldbach's Conjecture (素数判定)
    Poj 2662,2909 Goldbach's Conjecture (素数判定)
    poj 2388 Who's in the Middle(快速排序求中位数)
    poj 2388 Who's in the Middle(快速排序求中位数)
    poj 2000 Gold Coins(水题)
    poj 2000 Gold Coins(水题)
  • 原文地址:https://www.cnblogs.com/mr-stn/p/8951235.html
Copyright © 2011-2022 走看看