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

    Leetcode 二叉树中第二小的节点

    题目定义:

    给定一个非空特殊的二叉树,每个节点都是正数,并且每个节点的子节点数量只能为 2 或 0。
    如果一个节点有两个子节点的话,那么该节点的值等于两个子节点中较小的一个。
    
    更正式地说,root.val = min(root.left.val, root.right.val) 总成立。
    
    给出这样的一个二叉树,你需要输出所有节点中的第二小的值。如果第二小的值不存在的话,输出 -1 。
    
    示例 1:
                     2
        	        / 
                   2   5
                      / 
                     5   7 
        
    输入:root = [2,2,5,null,null,5,7]
    输出:5
    解释:最小的值是 2 ,第二小的值是 5 。  
        
    示例 2:
                    2
                   /  
                  2   2
    
    输入:root = [2,2,2]
    输出:-1
    解释:最小的值是 2, 但是不存在第二小的值。
    
    

    使用set 保存所有节点值并排序:

    class Solution {
        public int findSecondMinimumValue(TreeNode root) {
            if(root == null)
                return -1;
            Set<Integer> set = new HashSet<>();
            Queue<TreeNode> queue = new LinkedList<>();
            queue.offer(root);
            while(queue.size() > 0){
                TreeNode node = queue.poll();
                set.add(node.val);
                if(node.left != null)
                    queue.offer(node.left);
                if(node.right != null)
                    queue.offer(node.right);
            }
            List<Integer> result = new ArrayList<>(set);
            Collections.sort(result);
            if(result.size() == 1)
                return -1;
            else 
                return result.get(1);
        }
    }
    

    使用min 保存最小的节点:

    /*
    * 思路: 使用min 保存根节点的值(最小值),递归遍历所有节点,当递归到的节点大于最小值,
    *	    则返回该值并与其他节点对比,若两个节点都大于min 则取最小的那个值
    *       若 有节点小于 min(遍历到空节点,会返回 -1) ,则取所有值中最大的那个
    */
    class Solution {
        public int findSecondMinimumValue(TreeNode root) {
            if(root == null)
                return -1;
            return dfs(root,root.val);
        }
        private int dfs(TreeNode root,int min){
            if(root == null)
                return -1;
            if(root.val > min)
                return root.val;
            int left = dfs(root.left,min);
            int right = dfs(root.right,min);
            if(left > min && right > min)
                return Math.min(left,right);
            else 
                return Math.max(left,right);
        }
    }
    

  • 相关阅读:
    SpringMVC—对Ajax的处理(含 JSON 类型)(2)
    md5加密(1)
    js生成邀请码(2)
    SpringMVC---依赖注入与面向切面
    初识json
    java集合类(2)
    springmvc与struts2的区别
    模拟14
    NOIP模拟13
    NOIP模拟12
  • 原文地址:https://www.cnblogs.com/CodingXu-jie/p/14132353.html
Copyright © 2011-2022 走看看