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, 但是不存在第二小的值。

    解析

    从左子树和右子树找到一个比node更大的值。如果两个子树分别返回了两个值就取最小的那个。

    代码

    public int findSecondMinimumValue(TreeNode root) {
            if (root == null || (root.left == null && root.right == null)) {
                return -1;
            }
            int left = -1;
            int right = -1;
            if (root.left != null) {
                left = root.left.val == root.val ? findSecondMinimumValue(root.left) : root.left.val;
            }
            if (root.right != null) {
                right = root.right.val == root.val ? findSecondMinimumValue(root.right) : root.right.val;
            }
    
            if (left != -1 && right != -1) {
                return Math.min(left, right);
            } else if (left != -1) {
                return left;
            } else if (right != -1) {
                return right;
            } else {
                return -1;
            }
        }
    public int findSecondMinimumValue(TreeNode root) {
            if (root == null || (root.left == null && root.right == null)) {
                return -1;
            }
            List<Integer> list = new ArrayList<>();
            findSecondMinimumValueH(root, list, root.val, Integer.MAX_VALUE);
            if (list.size() <= 0) {
                return -1;
            }
            int min = list.get(0);
            for (int li : list) {
                if (li < min) {
                    min = li;
                }
            }
            return min;
        }
    
        public void findSecondMinimumValueH(TreeNode root, List<Integer> list, int minVal, int moreVal) {
            if (root == null) {
                return;
            }
            if (root.left != null) {
                int value = root.left.val;
                if (value > minVal && value <= moreVal) {
                    moreVal = value;//找出第一个大于minVal的值,然后不再继续
                    list.add(moreVal);
                } else {
                    findSecondMinimumValueH(root.left, list, minVal, moreVal);
                }
            }
    
            if (root.right != null) {
                int value = root.right.val;
                if (value > minVal && value <= moreVal) {
                    moreVal = value;//找出第一个大于minVal的值,然后不再继续
                    list.add(moreVal);
                } else {
                    findSecondMinimumValueH(root.right, list, minVal, moreVal);
                }
            }
        }

    这个代码和第一段代码有点区别:记录了所有分支中,第一个大于root.val的值,然后找出最小的,既是第二大的。

  • 相关阅读:
    java实现第八届蓝桥杯生命游戏
    java实现第八届蓝桥杯生命游戏
    进程&线程(&java.lang.Thread)详解
    IDEA入门(1)--lombok和Junit generator2插件的运用
    Ecplise中Junit4单元测试的基本用法
    Java 并发工具箱之concurrent包
    JDK 8 中包列表及介绍
    java中URLEncode和URLDecode
    Mybatis中输出映射resultType与resultMap的区别
    ANSI编码方式转化为UTF-8方式
  • 原文地址:https://www.cnblogs.com/fanguangdexiaoyuer/p/11434925.html
Copyright © 2011-2022 走看看