二叉树中第二大的值 Second Minimum Node In a Binary Tree

本文介绍了一种特殊二叉树的数据结构,并提供两种方法来寻找该二叉树中第二小的节点值,包括深度优先搜索(DFS)和广度优先搜索(BFS)。通过示例说明了算法的具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题:

Given a non-empty special binary tree consisting of nodes with the non-negative value, where each node in this tree has exactly two or zero sub-node. If the node has two sub-nodes, then this node's value is the smaller value among its two sub-nodes.

Given such a binary tree, you need to output the second minimum value in the set made of all the nodes' value in the whole tree.

If no such second minimum value exists, output -1 instead.

Example 1:

Input: 
    2
   / \
  2   5
     / \
    5   7
Output: 5
Explanation: The smallest value is 2, the second smallest value is 5.

Example 2:

Input: 
    2
   / \
  2   2
Output: -1
Explanation: The smallest value is 2, but there isn't any second smallest value.

解决:

① 二叉树中的任一节点,要么没有子节点,要么有两个子节点,而且父结点值是子结点值中较小的那个,当然两个子结点值可以相等。

直接遍历,由题意可知,根节点是最小值first,然后查找第二大的值即可。dfs

class Solution { //3ms
    public int findSecondMinimumValue(TreeNode root) {
        return dfs(root,root.val);
    }
    public int dfs(TreeNode root,int fir){
        if (root == null) return -1;
        if (root.val != fir) return root.val;
        int left = dfs(root.left,fir);
        int right = dfs(root.right,fir);
        return (left == -1 || right == -1) ? Math.max(left,right) : Math.min(left,right);
    }
}

② bfs。

class Solution { //4ms
    public int findSecondMinimumValue(TreeNode root) {
        int fir = root.val;
        int sec = Integer.MAX_VALUE;
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        while(! queue.isEmpty()){
            TreeNode cur = queue.poll();
            if (cur.val != fir && cur.val < sec){
                sec = cur.val;
            }
            if (cur.left != null) queue.offer(cur.left);
            if (cur.right != null) queue.offer(cur.right);
        }
        return (sec == fir || sec == Integer.MAX_VALUE) ? -1 : sec;
    }
}

 

转载于:https://my.oschina.net/liyurong/blog/1606181

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值