Second Minimum Node In a Binary Tre

题目:二叉树中第二小的节点

解决方法

方法一

思路

用深度优先搜索遍历此二叉树,同时利用Set结构(具有唯一性)记录树中每个不一样的值。然后从set中找到第二小的值。
最小的节点一定是二叉树的根节点。

代码示例

class Solution {
    public void dfs(TreeNode root, Set<Integer> uniques) {
        if (root != null) {
            uniques.add(root.val);
            dfs(root.left, uniques);
            dfs(root.right, uniques);
        }
    }

    public int findSecondMinimumValue(TreeNode root) {
        Set<Integer> uniques = new HashSet<Integer>();
        dfs(root, uniques);//二叉树前序遍历所有结点并添加到hashset集合中,去重

        int min = root.val;//根据题目的限定条件,根节点是整个二叉树的最小值
        long ans = Long.MAX_VALUE;
        for (int v : uniques) {
            if (min < v && v < ans) {//遍历集合,找到第二小的值
                ans = v;
            }
        }
        //return ans == Long.MAX_VALUE ? -1 : (int) ans;
        return ans < Long.MAX_VALUE ? (int) ans : -1;//如果ans小于Long.MAX_VALUE说明找到了第二小的值
    }
}

复杂度分析

N是给定的树中的所有结点的数量
时间复杂度:O(N)。
空间复杂度:O(N)。

方法二

思路

基于方法一的优化。
让min = root.val,当遍历树的节点时,如果node.val > min,结合题意我们可以推测出,在子树中的所有值都是大于等于node.val ,这个值就是我们想要的答案,所以我们没有必要在搜索子树。

我们只关心第二小的值,我们不需要记录任何比当前候选值大的值,所以我们可以不需要像方法一那样,通过set结构保存所有的值。

代码示例

复杂度分析

时间复杂度:O(N),我们需要访问每个节点最多一次。
空间复杂度:O(N)。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 题量有点多,建议Ctrl + F题号或题目哦~ 二叉树的遍历(前序遍历,中序遍历,后序遍历)[144] Binar...
    野狗子嗷嗷嗷阅读 12,972评论 2 37
  • 树的概述 树是一种非常常用的数据结构,树与前面介绍的线性表,栈,队列等线性结构不同,树是一种非线性结构 1.树的定...
    Jack921阅读 9,930评论 1 31
  • 1 序 2016年6月25日夜,帝都,天下着大雨,拖着行李箱和同学在校门口照了最后一张合照,搬离寝室打车去了提前租...
    RichardJieChen阅读 10,606评论 0 12
  • 是谁,陪你撑着伞, 走过泥泞潮湿的桥和路? 又是谁,走在你身旁, 和你一起在雨天里放烟火? 是谁,出现在雨天, 温...
    琮钰阅读 3,255评论 0 0
  • 前言 我和他相遇在一个并不闷热的夏天,直至此刻,四年后的今天,我依旧可以清晰的描摹出他的轮廓。顾朗,你还好吗? ...
    糊锅阅读 1,592评论 0 0